Можно ли использовать оператор Case в предложении sql From - PullRequest
22 голосов
/ 14 марта 2009

Можно ли использовать оператор Case в предложении sql From с использованием SQL 2005? Например, я пытаюсь что-то вроде:

SELECT Md5 FROM 
CASE
    WHEN @ClientType = 'Employee' THEN @Source = 'HR'
    WHEN @ClientType = 'Member' THEN  @Source = 'Other'
END CASE 
WHERE Current = 2;

Ответы [ 5 ]

23 голосов
/ 14 марта 2009

Я не верю, что это возможно. С одной стороны, оптимизаторы запросов предполагают определенный список табличных элементов в предложении FROM.

Самый простой обходной путь, который я могу придумать, - это СОЮЗ между двумя таблицами:

SELECT  md5
FROM    hr
WHERE   @clienttype = 'Employee'
AND     current = 2
UNION
SELECT  md5
FROM    other
WHERE   @clienttype = 'Member'
AND     current = 2;

Только одна половина UNION может быть True, учитывая предикат @clienttype.

6 голосов
/ 14 марта 2009

Предполагается, что SQL Server:

Вам необходимо использовать динамический SQL. Создайте строку и затем вызовите sp_executesql со строкой.

Редактировать: еще лучше, просто используйте операторы if для выполнения соответствующего оператора и присвойте значение переменной. Вы должны избегать динамического SQL, если это возможно.

1 голос
/ 14 марта 2009

Нет, вы не можете выбрать таблицу для запроса с помощью оператора CASE. Операторы CASE идут только внутри выражений, например для значения столбца или как часть выражения WHERE.

Это следует сделать, если вы ищете только одно значение:

IF @ClientType = 'Employee' BEGIN
    SET @Source = (SELECT Md5 FROM HR WHERE Current = 2)
END
ELSE IF @ClientType = 'Member' BEGIN
    SET @Source = (SELECT Md5 FROM Other WHERE Current = 2)
END
0 голосов
/ 14 марта 2009

Я думаю, можно с уверенностью сказать, что ответ - нет. И это независимо от диалекта SQL.

0 голосов
/ 14 марта 2009

Поскольку вы не указываете, к какому бэкэнду вы будете обращаться, на этот вопрос будет сложно ответить ....

Насколько я могу судить, вы не сможете сделать это ни против MS SQL Server, ни против Interbase / Firebird. Я не могу говорить за другие серверы, хотя ...

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...