В конъюнктивной нормальной форме («серии Анд», менее зависимой от 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;
'AGE = 'man' OR (@ AGE = 'MAN' и AGE = 'boy')'? –
@Damien_The_Unbeliever: Я не думаю, что это так просто, как, например, что когда '@AGE = 'man'' и' AGE =' boy'' условие поиска OP имеет значение TRUE, а ваше значение FALSE. - – onedaywhen
@onedaywhen: Почему это было бы правдой. Первое сравнение дает False, второй и третий урожай True. Сочетание последних двух дает Истину, а дизъюнкция False и True снова верна. –