2

WHERE 句の CASE ステートメントに問題があります。私のクエリでは、日付より前の行を取得したいと考えています。日付は 3 列でチェックされます。date1はNOT NULLなのでNULLチェックは必要ありませんが、日付はdate2NULLになる可能性があるので、NULLdate3をチェックしてそれに応じて日付条件をチェックしたいと思います。私は2つのアプローチを試みましたが、それを正しく行う方法がわかりません。手伝ってくれますか?

クエリ 1:

SELECT *
FROM
    docs
WHERE
    date1 < '20120601'
    AND CASE
        WHEN date2 IS NOT NULL AND date3 IS NOT NULL THEN date2 < '20120601' 
        WHEN date2 IS NOT NULL AND date3 IS NULL THEN date2 < '20120601'
        WHEN date2 IS NULL AND date3 IS NOT NULL THEN date3 < '20120601'
    END

これは、次の場合に最初にエラーを発生させます。Incorrect syntax near '<'.

クエリを次のように変更しました。

SELECT *
FROM
    docs
WHERE
    date1 < '20120601'
    AND CASE
        WHEN date2 IS NOT NULL AND date3 IS NOT NULL AND date2 < '20120601' THEN TRUE 
        WHEN date2 IS NOT NULL AND date3 IS NULL AND date2 < '20120601' THEN TRUE
        WHEN date2 IS NULL AND date3 IS NOT NULL AND date3 < '20120601' THEN TRUE
    END

別のエラーが発生しました:An expression of non-boolean type specified in a context where a condition is expected, near 'END'.

4

4 に答える 4

8

これは機能するはずです:

SELECT *
FROM
    docs
WHERE (date1 < '20120601')
OR    (date2 IS NOT NULL AND date2 < '201205601')
OR    (date2 IS NULL AND date3 IS NOT NULL AND date3 < '20120601')
于 2012-11-10T12:20:55.950 に答える
2
where
date1 < '20120601'
    and
coalesce(date2, date3, '20000101') < '20120601'
于 2012-11-10T12:57:49.507 に答える
0

これはどうですか ?

SELECT *
FROM
    docs
WHERE date1 < '20120601'
  AND ISNULL(date2, '20120601') < '20120601'
  AND ISNULL(date3, '20120601') < '20120601'
于 2012-11-10T12:17:01.330 に答える
0

正しい答えは次のとおりです。

SELECT *
FROM
    docs
WHERE
    date1 < '20120601' AND
        ((date2 IS NOT NULL AND date3 IS NOT NULL AND date2 < '20120601') OR 
         (date2 IS NOT NULL AND date3 IS NULL AND date2 < '20120601') OR
         (date2 IS NULL AND date3 IS NOT NULL AND date3 < '20120601'))
于 2013-12-19T20:02:14.133 に答える