2016-07-01 1 views
-1

У меня есть этот запрос.Сложность в настройке запроса с использованием «CASE WHEN»

логика выбора является, существует ли параметр @USER_NAME в течение 3 следующих таблицах в соответствующих столбцах:

MODEL_RESPONSIBLE MR> MR.USER_NAME
RESPONSIBLE_PLANT_MODEL> RPM.USER_NAME_MPR
RESPONSIBLE_AREA_MODEL> RAM.USER_NAME_AM

DECLARE 
@USER_NAME varchar(max) = 'lorem', 
@PROFILE_USER varchar(max) = null; 

SELECT @USER_NAME, UserProfile = 
     CASE @USER_NAME 
     WHEN IN(RAM.USER_NAME_AM) THEN @PROFILE_USER = 'PROFILE 01' 
     WHEN IN(RPM.USER_NAME_MPR) THEN @PROFILE_USER = 'PROFILE 02' 
     WHEN IN(MR.USER_NAME) THEN @PROFILE_USER = MR.PROFILE_NAME 
     ELSE @PROFILE_USER = '' 
     END, 
    UserProfile 
FROM MODELO M 
INNER JOIN MODEL_RESPONSIBLE MR ON MR.ID_MODEL = M.ID_MODEL 
INNER JOIN RESPONSIBLE_PLANT_MODEL RPM ON RPM.ID_MODEL = M.ID_MODEL 
INNER JOIN RESPONSIBLE_AREA_MODEL RAM ON RAM.ID_MODEL = M.ID_MODEL 

Тест не работал должным образом.

Как лучше всего собрать запрос, это было бы с CASE или IF?

Как правильно присвоить значение @PROFILE_USER?

ERROR: Incorrect syntax near the keyword 'IN'.

+1

Отметьте используемые dbms, некоторые не ANSI SQL там. – jarlh

+0

В качестве примечания вы можете исправить эту конкретную ошибку, просто удалив 'IN' после каждого' WHEN'. Затем вы получите еще одну ошибку, но я не уверен, какой из них. Если бы я угадал, это было бы связано с '=' после каждого 'THEN'. –

+0

@ GordonLinoff Точно. Исключение из '=' –

ответ

0

Выражение CASE можно записать в виде:

SELECT @USER_NAME, 
     @PROFILE_USER = 
     CASE @USER_NAME 
     WHEN RAM.USER_NAME_AM THEN 'PROFILE 01' 
     WHEN RPM.USER_NAME_MPR THEN 'PROFILE 02' 
     WHEN MR.USER_NAME THEN MR.PROFILE_NAME 
     ELSE '' 
     END as UserProfile, 
    UserProfile 
FROM MODELO M 
... 
3

вам нужно сослаться на поле в каждой строке заявления

DECLARE 
@USER_NAME varchar(max) = 'lorem', 
@PROFILE_USER varchar(max) = null; 

SELECT @USER_NAME, 
     CASE 
     WHEN @USER_NAME IN(RAM.USER_NAME_AM) THEN @PROFILE_USER = 'PROFILE 01' 
     WHEN @USER_NAME IN(RPM.USER_NAME_MPR) THEN @PROFILE_USER = 'PROFILE 02' 
     WHEN @USER_NAME IN(MR.USER_NAME) THEN @PROFILE_USER = MR.PROFILE_NAME 
     ELSE @PROFILE_USER 
     END as UserProfile, 
    UserProfile 
FROM MODELO M 
INNER JOIN MODEL_RESPONSIBLE MR ON MR.ID_MODEL = M.ID_MODEL 
INNER JOIN RESPONSIBLE_PLANT_MODEL RPM ON RPM.ID_MODEL = M.ID_MODEL 
INNER JOIN RESPONSIBLE_AREA_MODEL RAM ON RAM.ID_MODEL = M.ID_MODEL 
+0

Я просто пробовал, как вы предлагали, но появляется такая же ошибка. –

+0

Я понимаю ответ, но он логически и синтаксически неверен. Перспективы особенно озадачивают. –

+0

@ThamiresCunha Я сделал другое изменение, я не понял в вашем исходном скрипте, что вы иногда устанавливали переменную внутри аргумента case. Если это не сработает, я бы предложил полностью удалить оператор case и вернуть все поля, на которые вы ссылаетесь, и убедиться, что они работают до дальнейшего развития, это может быть ошибка сопоставления, неправильное имя поля ... сначала проверьте их а затем вернуться к заявлению дела. Это также помогло бы увидеть ожидаемый результат и данные –

0

Ваш запрос находится в большом беспорядке, но я считаю, что это похоже на то, что вы хотели получить от своего CASE:

@PROFILE_USER = 
CASE 
    WHEN @USER_NAME IN (RAM.USER_NAME_AM) THEN 'PROFILE 01' 
    WHEN @USER_NAME IN (RPM.USER_NAME_MPR) THEN 'PROFILE 02' 
    WHEN @USER_NAME IN (MR.USER_NAME) THEN MR.PROFILE_NAME 
    ELSE '' 
END 
0

Ваш запрос просто не является SQL. У этого есть проблемы как логические (внутренние соединения только успешны, если записи находятся во всех трех таблицах), так и синтаксические.

Я считаю, что это то, что вы хотите сделать:

SELECT @USER_NAME, 
     (CASE WHEN EXISTS (SELECT 1 FROM MODEL_RESPONSIBLE MR WHERE MR.ID_MODEL = M.ID_MODEL AND RAM.USER_NAME_AM = @USER_NAME) 
      THEN 'PROFILE 01' 
      WHEN EXISTS (SELECT 1 FROM RESPONSIBLE_PLANT_MODEL RPM WHERE RPM.ID_MODEL = M.ID_MODEL AND RPM.USER_NAME_MPR = @USER_NAME) 
      THEN 'PROFILE 02' 
      ELSE (SELECT MR.PROFILE_NAME FROM RESPONSIBLE_AREA_MODEL RAM WHERE RAM.ID_MODEL = M.ID_MODEL AND MR.USER_NAME = @USER_NAME) 
     END) as UserProfile 
FROM MODELO M ; 

Если вы хотите установить переменную @UserProfile, то она будет выглядеть следующим образом:

SELECT @UserProfile = 
     (CASE WHEN EXISTS (SELECT 1 FROM MODEL_RESPONSIBLE MR WHERE MR.ID_MODEL = M.ID_MODEL AND RAM.USER_NAME_AM = @USER_NAME) 
      THEN 'PROFILE 01' 
      WHEN EXISTS (SELECT 1 FROM RESPONSIBLE_PLANT_MODEL RPM WHERE RPM.ID_MODEL = M.ID_MODEL AND RPM.USER_NAME_MPR = @USER_NAME) 
      THEN 'PROFILE 02' 
      ELSE (SELECT MR.PROFILE_NAME FROM RESPONSIBLE_AREA_MODEL RAM WHERE RAM.ID_MODEL = M.ID_MODEL AND MR.USER_NAME = @USER_NAME) 
     END) 
FROM MODELO M ; 

Или alternatvely, LEFT JOIN может быть уместным:

SELECT @USER_NAME, 
     (CASE WHEN RAM.USER_NAME_AM IS NOT NULL THEN 'PROFILE 01' 
      WHEN RPM.USER_NAME_MPR THEN 'PROFILE 02' 
      ELSE MR.PROFILE_NAME 
     END) as UserProfile 
FROM MODELO M LEFT JOIN 
    MODEL_RESPONSIBLE MR 
    ON MR.ID_MODEL = M.ID_MODEL AND RAM.USER_NAME_AM = @USER_NAME LEFT JOIN 
    RESPONSIBLE_PLANT_MODEL RPM 
    ON RPM.ID_MODEL = M.ID_MODEL AND RPM.USER_NAME_MPR = @USER_NAME LEFT JOIN 
    RESPONSIBLE_AREA_MODEL RAM 
    ON RAM.ID_MODEL = M.ID_MODEL AND MR.USER_NAME = @USER_NAME; 

Это было бы более естественным способом e xpressing эту логику.

В качестве примечания, ваш синтаксис предлагает SQL Server. Вы не можете устанавливать переменные и возвращать данные с помощью одного оператора SELECT в SQL Server.