2012-04-17 2 views
2

Возможно ли сделать что-то вроде того, что происходит здесь, в заявлении where @Age param?Удвоение вверх по состоянию WHERE

@AGE Varchar(8) 

SELECT NAME FROM TABLE WHERE 
(
If @AGE='man' 
    then (AGE = 'man' or AGE = 'boy') 
    else (AGE = 'man') 
) 
AND City IS NULL 
+4

'AGE = 'man' OR (@ AGE = 'MAN' и AGE = 'boy')'? –

+0

@Damien_The_Unbeliever: Я не думаю, что это так просто, как, например, что когда '@AGE = 'man'' и' AGE =' boy'' условие поиска OP имеет значение TRUE, а ваше значение FALSE. - – onedaywhen

+0

@onedaywhen: Почему это было бы правдой. Первое сравнение дает False, второй и третий урожай True. Сочетание последних двух дает Истину, а дизъюнкция False и True снова верна. –

ответ

2

Да, что-то вроде этого:

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 быть пустым.

Я ответил на очень похожий вопрос here.

Это очень распространенная техника в предложении WHERE. Если вы хотите, чтобы применяли логику «IF» в предложении WHERE, все, что вам нужно сделать, это добавить дополнительное условие с булевым И к разделу, где ему нужно .

1

один из способов сделать это с EXEC и построить командную строку с помощью If's.

что-то вроде этого:

declare @t nvarchar(max) 
@AGE Varchar(8) 
set @t=' SELECT NAME FROM TABLE WHERE ' 


If @AGE='man' set @[email protected]+'(AGE = ''man'' or AGE = ''boy'')' 
    else set @[email protected]+'(AGE = 'man')' 

set @[email protected]+' AND City IS NULL' 
0

ИЛИ вы можете использовать decode functions

+1

Вопрос помечен 'sql-server'. 'DECODE' не существует на SQL Server. –

1

В конъюнктивной нормальной форме («серии Анд», менее зависимой от 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; 
Смежные вопросы