4

PostgreSQLクエリの結果を、真であるOR句の数で順序付けする必要があります。たとえば、Postgresql:真のOR句の数でランクを計算する

SELECT * FROM mytable WHERE cond1 OR cond2 OR cond3 ORDER BY rank DESC 

のようなクエリは、満たされた条件の数に基づいて結果をランク付けする必要があります。また、ビュー/ストアドプロシージャでこの問題を解決するアプローチも大歓迎です!

答えて

5

を繰り返し条件とそれらを追加:

SELECT * FROM mytable 
WHERE fld = 'A' OR fldB = CURRENT_DATE OR fldC = 7 
ORDER BY 
    (fld = 'A')::int + (fldB = CURRENT_DATE)::int + (fldC = 7)::int 
DESC 
-2
The above query will check those conditions from the left side one by one i.e 

if the cond1 is true then 
     return the results order by rank. 
if cond1 is false and cond2 is true then 
     return the results order by rank. 
if cond1 and cond2 both are false but cond3 is true 
     returns the results order by rank. 
if all conditions are false then no result is returned.  

So in brief it doesn't check all the conditions simultaneously for OR conditions. 


Thanks. 
+0

これは、クエリの期待される動作の要約です。はい.... –

2

を多分このような何か:

select * 
from (
    SELECT * , case when cond1 then 1 else 0 end 
      + case when cond2 then 1 else 0 end 
      + case when cond3 then 1 else 0 end as cond_count 
    FROM mytable 
    WHERE cond1 
     OR cond2 
     OR cond3 
) t 
order by cond_count desc 

このソリューションについての醜いところは、声明の中で二回すべての条件を持っているということです、今は別の解決策は考えられません。

+0

'CASE'キーワードを省略できますか? – vyegorov

+0

@vyegorov:もちろんではありません。それを指摘してくれてありがとう。 –

+0

@a_horse_with_no_name:私はユーザーが集計したいとは思わない。単にCASE文を追加してください。副選択を取り除いて、式を 'ORDER BY'節に入れることもできます。 –

関連する問題