web-dev-qa-db-ja.com

そのときのケースですが、その前とその前にAND条件が含まれています

以下のクエリで、CASEのWHEN内にAND条件を追加し、その前にTHENを使用することは可能ですか?

たとえば、WHEN 'r' AND table1.name = "jones" THEN 'very high'

SELECT table1.id, table1.name,
   CASE table1.event
     WHEN 'r' THEN 'very high'
     WHEN 't' THEN 'very low'
     ELSE (SELECT table2.risk FROM table2 WHERE table2.value <= table1.value
           ORDER BY table2.value DESC LIMIT 1)
   END AS risk
FROM table1
ORDER BY FIELD( table1.event, 'r', 'f', 't' ), table1.value DESC
13
Anisoropos

あなたはあなたが望むことを達成するためにこのようにあなたのステートメントを書き直すことができます

SELECT table1.id, table1.name,
   CASE 
     WHEN table1.event = 'r' AND table1.name = 'jones' THEN 'very high'
     WHEN table1.event = 't' AND table1.name = 'smith' THEN 'very low'
     ELSE (SELECT table2.risk FROM table2 WHERE table2.value <= table1.value
           ORDER BY table2.value DESC LIMIT 1)
   END AS risk
FROM table1
ORDER BY FIELD( table1.event, 'r', 'f', 't' ), table1.value DESC

削除する必要があることに注意してくださいtable1.eventCASEステートメントの後。 ドキュメントはこちら

30
Brian Glaz

ブール(trueまたはfalse)に評価されるものはすべて、WHENステートメントのCASE条件に入れることができます。したがって、'r'を次のように置き換えることができます。

('r' AND table1.name='jones')

これについてもっと考えると、CASEの後にtable1.eventを失う必要があるかもしれません

SELECT table1.id, table1.name,
    CASE 
        WHEN (table1.event = 'r' AND table1.name='Jones') THEN 'very high'
        WHEN table1.event = 't' THEN 'very low'
        ELSE (SELECT table2.risk 
              FROM table2 
              WHERE table2.value <= table1.value 
              ORDER BY table2.value DESC LIMIT 1)
    END AS risk
FROM table1
ORDER BY FIELD( table1.event, 'r', 'f', 't' ), table1.value DESC
6
Josh Darnell

case <column> when <value> then ...からcase when <condition> then ...に切り替えます。

CASE 
WHEN table1.event = 'r' AND table1.active = 1 THEN 'very high'
...
5
Andomar