2016-07-01 23 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

注意しておくと、それぞれの 'WHEN'の後に' IN'を削除するだけで、その特定のエラーを修正することができます。あなたは別のエラーが表示されますが、どちらが正しいか不明です。私が推測しなければならないのは、それぞれのTHENの後に '='に関係するということです。 –

+0

@GordonLinoff正確に。 Exception in '=' –

答えて

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

答えは分かりますが、論理的にも構文的にも正しくありません。 upvotesは特に困惑しています。 –

+0

@ThamiresCunha私は別の変更を加えました。元のスクリプトでは、時折case文の中に変数を設定していました。これがうまくいかない場合は、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ではありません。構文上だけでなく、論理的にも問題があります(レコードが3つのテーブルすべてにある場合、内部結合は成功します)。

私は、これはあなたが何をしたいかであると考えている:

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; 

これはもっと自然な方法ですこの論理をxpressingする。

メモとして、構文はSQL Serverを示しています。 SQL Serverの単一のSELECTステートメントを使用して、変数を設定してデータを返すことはできません。

関連する問題