2017-05-08 1 views
0

MySQLでは、WHERE句のセットから空ではない最初の結果を返すクエリを設定できますか?これらの列が一意である、私はOR文節のいずれかにマッチする最初の行を返すALMOSTMySQL - 複数のwhere句から空でない最初の結果を取得する

SELECT * FROM t 
WHERE id = NULL OR a = 2 OR b = 6 

ようなクエリしたいと思う例えば、私はテーブルを持っている場合

|id |a |b | 
---------------- 
1  2 3 
4  5 6 
7  8 9 

idabの順で、ほぼCOALESCEのようです。ここで

は、いくつかの例のクエリと予想される結果

SELECT * FROM t WHERE id = 7 OR a = 99 OR b = 3 --> (7, 8, 9) 
SELECT * FROM t WHERE id = 7 OR a = NULL OR b = NULL --> (7, 8, 9) 
SELECT * FROM t WHERE id = NULL OR a = 5 OR b = 77 --> (4, 5, 6) 
SELECT * FROM t WHERE id = NULL OR a = NULL OR b = 6 --> (4, 5, 6) 
SELECT * FROM t WHERE id = 1 OR a = 5 OR b = 9 --> (1, 2, 3) 

これが可能であるですか?

idは、あなたのテーブルの主キーである場合は、合体によってそれを行うことができます
+0

あなたのデータには 'id = NULL'がありませんので、あなたの質問は何ですか?あなたはもっと多くの行を追加して、希望の出力とより多くのテストケースを指定できますか? –

+0

@JuanCarlosOropezaもっと良い結果がいくつか追加されました – shane

+0

。あなたの3番目の例では、 'ID IS NULL OR a = 5 OR b = 77'という行があります。' {NULL、5、NULL} 'と' {NULL、NULL、77}ショー? –

答えて

2
SELECT * FROM t 
WHERE id IS NULL 
    OR a = 2 
    OR b = 6 
order by case when id IS NULL then 1 
       when a = 2 then 2 
       when b = 6 then 3 
     end 
limit 1 
0

:これは、あなたが「最初の行」によって何を意味するかを前提としてい

SELECT * FROM t 
WHERE id IN 
(SELECT COALESCE ((SELECT id FROM t WHERE id IS NULL), 
     COALESCE ((SELECT id FROM t WHERE a = 2), 
        (SELECT id FROM t WHERE b = 6)))) 
ORDER BY id 
LIMIT 1; 

SELECT * FROM t 
WHERE id IN 
(SELECT COALESCE ((SELECT id FROM t WHERE id = 7), 
     COALESCE ((SELECT id FROM t WHERE a = 99), 
        (SELECT id FROM t WHERE b = 3)))) 
ORDER BY id 
LIMIT 1; 

は最低idを有するものです。

+0

私が最初の行で意味したのは、 'id'' a''b'の順にどこの制約にもマッチする最初の行です – shane

関連する問題