9

SQL サーバーで次のクエリを実行しようとしています。

declare @queryWord as nvarchar(20) = 'asdas'

SELECT  * FROM TABLE_1 
WHERE (ISDATE(@queryWord) = 1) 
AND TABLE_1.INIT_DATE = CONVERT(Date, @queryWord)

'asdas'に変換できないため、明らかにエラーが発生しますDate。しかし、私は別の動作を期待していました。つまり、 is であるためISDATE(@queryWord) = 1falseSQL が 2 番目の条件をチェックしないことを期待していましたが、どうやらチェックされているようです。

このクエリを実行する方法が他にもいくつかあることは知っていますが、これは私の質問ではありません。最初の条件が満たされていない場合、2番目の条件をチェックしない方法があるのだろうか。SQLはすでにこれを行っていると思っていたので、興味があります。

4

5 に答える 5

2

私はあなたが2つのパスでそれを行うことができると思います:

declare @queryWord as nvarchar(20) = 'asdas'


    select
    *
    from
    (
    SELECT  * FROM TABLE_1 
    WHERE (ISDATE(@queryWord) = 1) ) t1
    where t1.INIT_DATE = CONVERT(Date, @queryWord)

したがって、内側のクエリが最初のテストを実行し、外側のクエリが 2 番目のテストを実行します。単一のクエリでは、条件を評価する順序を強制する方法はないと思います。

于 2013-10-17T14:23:54.067 に答える
1

CASEステートメントで「シミュレート」できます。ただしTRUE、2 番目の条件のチェックを避けるために、最初の条件に値を指定する必要があります。

declare @queryWord as nvarchar(20) = 'asdas'

SELECT  * 
FROM TABLE_1
WHERE (CASE 
       WHEN ISDATE(@queryWord) = 0 THEN 0 
       WHEN TABLE_1.INIT_DATE = CONVERT(Date, @queryWord) THEN 1
       ELSE 0 END) = 1
于 2013-10-17T17:50:37.707 に答える
1

WHERE 条件で CASE を使用しないのはなぜですか?

DECLARE @tester TABLE (
    theDate DATE,
    theValue INT
    )

INSERT INTO @tester VALUES ('2013-10-17', 35)
INSERT INTO @tester VALUES ('2013-10-16', 50)
INSERT INTO @tester VALUES ('2013-10-15', 2)

declare @queryWord as nvarchar(20) = 'asdas'
SELECT  *
FROM @tester
WHERE theDate =
    CASE
        WHEN ISDATE(@queryWord) = 1 THEN CONVERT(Date, @queryWord)
        ELSE theDate
    END

SET @queryWord = '2013-10-17'
SELECT  *
FROM @tester
WHERE theDate =
    CASE
        WHEN ISDATE(@queryWord) = 1 THEN CONVERT(Date, @queryWord)
        ELSE theDate
    END
于 2013-10-17T14:26:59.833 に答える