2017-11-04 4 views
1

DBにカスタムリストが設定されている場合、フィルタリングされる可能性のある顧客の値を返すようにしています。where節がnullでなく、同じ状態に属するユーザーとユーザーのリストを返します

カスタムリストがアップロードされている場合、そのリスト内のすべての顧客とその州に属する顧客を返すクエリを作成したいと思います。それ以外の場合は、リストが設定されていない場合はフィルタリングされていないリストを返します。

は、これは私がそれが私の目標を達成望ん書いたものですが、リストがアップロードされた場合はフィルタリングするために失敗しているとコメントアウト場合は、同じデータを返します。

SELECT U.userId 
     ,U.State 
     FROM UsersAndStates U 
     LEFT JOIN @CustomUsersAndState C -- variable table where custom list is stored for this query 
     on U.userId= C.userId 
WHERE U.userId LIKE CASE WHEN C.userId IS NOT NULL 
         THEN '%' + C.userId + '%' 
         WHEN C.userId IS NULL 
         THEN '%' + U.userId + '%' 
         WHEN C.State = U.State 
         THEN '%' + U.userId + '% 
         END 

をお読みいただきありがとうございました。

編集:固定別名間違い

+0

「S.userId」はどこから来たのですか? – Sami

+0

申し訳ありませんが、フォーマットミスでした。 – WSilhavy

答えて

1

あなたのロジックはに簡単になります。

SELECT U.userId, U.State 
FROM UsersAndStates U LEFT JOIN 
    @CustomUsersAndState C -- variable table where custom list is stored for this query 
    ON U.userId= C.userId 
WHERE (C.UserId IS NOT NULL AND U.userId LIKE '%' + C.userId + '%') OR 
     C.userId IS NULL 

あなたは尋ねるかもしれません: "状態条件に何が起こりましたの?"まあ、c.userIdNULLであるかどうかはNULLであるため、CASEの3番目の条件は決して実行されません。

一般に、ブール値式は、WHERE節のCASEステートメントより簡単に従うと考えられます。少なくとも、オプティマイザが処理する方が簡単です。

私が正しくあなたの状況を理解していれば、あなたが望むように思われる:

SELECT U.userId, U.State 
FROM UsersAndStates U LEFT JOIN 
    @CustomUsersAndState C -- variable table where custom list is stored for this query 
    ON U.userId = C.userId 
WHERE (C.UserId IS NOT NULL AND 
     (U.userId LIKE '%' + C.userId + '%' OR 
     U.state = C.state 
     ) 
    ) OR 
     C.userId IS NULL 

あなたは=が十分でいるように見えるだろうというとき、userIdためLIKEを使用している理由は、私が不明確だ:

WHERE (C.UserId IS NOT NULL AND (U.userId = C.userId OR U.state = C.state) 
    ) OR 
     C.userId IS NULL 

編集:

私はあなたが本当に欲しいロジックは:

SELECT U.userId, U.State 
FROM UsersAndStates U 
WHERE NOT EXISTS (SELECT 1 FROM @CustomUsersAndState C) OR 
     EXISTS (SELECT 1 
       FROM @CustomUsersAndState C 
       WHERE U.userId LIKE C.userId OR U.state = C.state 
      ); 
+0

元の質問に「userId」の代わりに '='の代わりに 'LIKE'を使用したことにコメントを追加しました。検索パターンに主要なワイルドカードがあると、パフォーマンスに大きな影響があります。 –

+0

ありがとうございます。 'LIKE'は何かを返すための私の最終的な試みでした。残念ながら、あなたの提案は、その州に属していない他のすべてのユーザーを返すことです。 'OR'の前の節の最初の部分は、フィルタされたリストをユーザに返します。 – WSilhavy

+0

@WSilhavy。 。 。私はそのコメントを理解していない。 'c.UserId'が' NULL'の場合、2番目のテーブルは空です。したがって、すべてのユーザーが返されます。 –

関連する問題