whereステートメントのパラメーターでここで起こっていることのようなことをすることは可能@Age
ですか?
@AGE Varchar(8)
SELECT NAME FROM TABLE WHERE
(
If @AGE='man'
then (AGE = 'man' or AGE = 'boy')
else (AGE = 'man')
)
AND City IS NULL
whereステートメントのパラメーターでここで起こっていることのようなことをすることは可能@Age
ですか?
@AGE Varchar(8)
SELECT NAME FROM TABLE WHERE
(
If @AGE='man'
then (AGE = 'man' or AGE = 'boy')
else (AGE = 'man')
)
AND City IS NULL
はい、次のようなものです。
SELECT NAME FROM TABLE WHERE
((@AGE='man'
AND (AGE = 'man' or AGE = 'boy'))
OR
(@AGE <> 'man'
AND (AGE = 'man')))
AND City IS NULL
@AGE <> 'man'
@AGE 変数が null になる可能性があるかどうかに応じて、条件を微調整する必要がある場合があることに注意してください。
ここで非常によく似た質問に答えました。
これは、WHERE 句で非常に一般的な手法です。WHERE 句に「IF」ロジックを適用する場合は、適用する必要があるセクションにブール AND を使用して追加の条件を追加するだけです。
接続法標準形 (「一連の AND」、parans への依存度が低い):
SELECT *
FROM TABLE
WHERE ( @AGE <> 'man' OR (AGE IN ('man', 'boy') ) )
AND ( @AGE = 'man' OR AGE = 'man' )
AND CITY IS NULL;
ここでの考え方は、含意書き換え規則を使用することです。
( IF x THEN y ) is equivalent to ( NOT ( x ) OR y )
ここにいくつかのテストコードがあります:
WITH T
AS
(
SELECT *
FROM (
VALUES (1, 'man', NULL),
(2, 'boy', NULL),
(3, 'girl', NULL)
) AS T (NAME, AGE, CITY)
),
Params
AS
(
SELECT *
FROM (
VALUES ('man'),
('boy'),
('girl')
) AS T (p_AGE)
),
Results
AS
(
SELECT Params.*, T.*,
CASE WHEN ( ( p_AGE <> 'man' OR (AGE IN ('man', 'boy') ) ) AND ( p_AGE = 'man' OR AGE = 'man' ) ) THEN 'TRUE'
WHEN NOT ( ( p_AGE <> 'man' OR (AGE IN ('man', 'boy') ) ) AND ( p_AGE = 'man' OR AGE = 'man' ) ) THEN 'FALSE'
ELSE 'UNKNOWN'
END AS result_onedaywhen,
CASE WHEN ( AGE='man' OR (p_AGE='MAN' and AGE='boy') ) THEN 'TRUE'
WHEN NOT ( AGE='man' OR (p_AGE='MAN' and AGE='boy') ) THEN 'FALSE'
ELSE 'UNKNOWN'
END AS result_Damien_The_Unbeliever
FROM T, Params
)
SELECT *
FROM Results;
これを行う 1 つの方法は、EXEC
を使用して String コマンドを作成することIf's
です。
このようなもの :
declare @t nvarchar(max)
@AGE Varchar(8)
set @t=' SELECT NAME FROM TABLE WHERE '
If @AGE='man' set @t=@t+'(AGE = ''man'' or AGE = ''boy'')'
else set @t=@t+'(AGE = 'man')'
set @t=@t+' AND City IS NULL'
または、デコード関数を使用できます