2016-08-03 3 views
0

に基づいて行を見つける:次のように私はテーブルを持っているserverlのcreiteria

id var status warehouse 
1 x True 1 
2 x False 1 
3 y False 1 

私はそれをvarを与えると、次のようにそれは私に一つだけの行を返すクエリを書きたいです。 statusがTrueの場合は、この行を最初に返します。そうでない場合は、ステータスを返します。何も見つからなければ何も返しません。

xたとえば にとってはid=1(2が間違っている!)を返します をyために、それは何も返さないだろうzためid=3 を返します。私は私のような2つのクエリと機能でそれを行うことができます知っている

given_input'x'または'z'または'y'

ある

select id into choose_id 
from tab 
where var=given_input and and status 
limit 1; 

IF choose_id IS NULL THEN 
    select id into choose_id 
    from tab 
    where var=given_input 
    limit 1; 
END IF; 

continue work with choose_id 

IFなステートメントのない単一のクエリでは、それはなんとかですか?

答えて

1

あなたはorder bylimitを使用することができます。あなただけのステータスDESC` BY `ORDERは

select t.* 
from tab t 
where var = $var 
order by (case when status = true then 1 else 2 end) 
limit 1; 
+1

行うことはできませんか? – jarlh

+1

@ jarlh。 。 。はい、これは真偽の単純化です。正直言って、経験の少ないユーザーはしばしばそれが真実であると誤解していると思います。

+0

@ GordonLinoff実際には、(ステータスが真、次に1が、2が他の場合)、ORDER BYステータスDESCは同じではありません。ブール値フィールドでも可能な 'Null'値は、それぞれのオプションで異なって順序付けされるので、これらは同じ解決法ではありません。 – Elad

関連する問題