Я пытался искать вокруг, но я не мог найти ничего, что помогло бы мне.
Я пытаюсь сделать это в SQL:
declare @locationType varchar(50);
declare @locationID int;
SELECT column1, column2
FROM viewWhatever
WHERE
CASE @locationType
WHEN 'location' THEN account_location = @locationID
WHEN 'area' THEN xxx_location_area = @locationID
WHEN 'division' THEN xxx_location_division = @locationID
Я знаю, что мне не нужно было ставить '= @locationID' в конце каждого, но я не могу получить синтаксис, даже близкий к правильному. SQL продолжает жаловаться на мой '=' в первой строке WHEN ...
Как я могу это сделать?
sql
switch-statement
case
миль
источник
источник
без постановки дела ...
источник
DECLARE @locationType NVARCHAR(50) = 'youchoose' IF @locationType = 'location' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (account_location = @locationID) END IF @locationType = 'area' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (xxx_location_area = @locationID) END IF @locationType = 'division' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (xxx_location_division = @locationID) END
Ну вот.
источник
Я бы сказал, что это показатель некорректной структуры таблицы. Возможно, разные типы местоположений должны быть разделены в разных таблицах, что позволяет вам выполнять более сложные запросы, а также избегать лишних столбцов вокруг.
Если вы не можете изменить структуру, может сработать что-то вроде приведенного ниже:
И так далее ... Мы не можем изменить структуру запроса на лету, но мы можем переопределить его, сделав предикаты равными себе.
РЕДАКТИРОВАТЬ: вышеупомянутые предложения, конечно, намного лучше, просто игнорируйте мои.
источник
Проблема заключается в том, что когда движок SQL анализирует выражение, он проверяет часть FROM, чтобы получить правильные таблицы, а затем часть WHERE, чтобы предоставить некоторые базовые критерии, поэтому он не может правильно оценить динамическое условие, для какого столбца проверить против.
Вы можете использовать предложение WHERE при проверке критериев WHERE в предикате, таких как
поэтому в вашем конкретном случае вам нужно поместить запрос в хранимую процедуру или создать три отдельных запроса.
источник
Оператор ИЛИ может быть альтернативой случая, когда в условии где
источник
Пожалуйста, попробуйте этот запрос. Ответ на пост выше:
источник
Попробуй это:
источник
источник
источник
Попробуйте этот запрос. Это очень легко понять:
источник