2017-10-30 5 views
0

私はアクセス権のテストを行うために書いています。私が見なければならない列の1つはABC|DEF|GHI|JKLの形式であり、その列に存在する値があるかどうかを調べる必要があります。LIKEを使用したカラム内のデータのSQLテスト

問題は、複数の値を返すサブクエリのためにクエリでエラーが発生する原因となっている複数のテストが必要なことです。

私は @managers内のいずれかの値が列の値(例えば、列の値: ABC|DEF|GHI|JKL)に存在するかどうかを確認するために、テストに取り掛かることができますどのように
-- Default permission 
DECLARE @hasAccess BIT = 0; 

-- Define our temp data 
DECLARE @managers AS TABLE(personnelID VARCHAR(10)) 

-- Insert our data for the manager test logic 
INSERT INTO @managers(personnelID) VALUES ('ABC') 
INSERT INTO @managers(personnelID) VALUES ('XYZ') 


SELECT * 
FROM Employees AS e 
WHERE e.QID = @QID 
    AND e.PersonnelIDList LIKE '%' + (SELECT personnelID FROM @managers) + '%' 

はレコードに存在します。

+0

あなたは、他のテーブルのように、あなたのテーブル変数を治療する必要があります。この場合、内部結合を使用するか、存在します。 –

+0

複数の値を含む列が不適切な設計です。 –

+0

このレガシーツールで私がここで作業できるものに限定して、私は同意して設計について理解しています。 – SBB

答えて

0

リストを文字列として保存しないでください。これは単なる悪い考えです。代わりに別のテーブルが必要です。

時々、私たちは他の人の本当に悪い設計決定に悩まされています。この場合は、あなたがexistsサブクエリを使用することができます:LIKE句では

SELECT e.* 
FROM Employees e 
WHERE e.QID = @QID AND 
     EXISTS (SELECT 1 
       FROM @managers m 
       WHERE '|' + e.PersonnelIDList + '|' LIKE '%|' +personnelID + '|%' 
      ); 
+0

'LIKE '%|' + foo + '|%' 'は前後に' | 'がない場合、先頭と末尾の要素を見落とします。 – Shawn

+0

@Shawn。 。 。いい視点ね。私は表現の残りの半分を見逃していました。 –

0

を、あなただけのサブクエリが単一の結果を返すことが許さいます。
@managersテーブルに参加し、join句内のlikeを使用します。

-- Default permission 
DECLARE @hasAccess BIT = 0; 

-- Define our temp data 
DECLARE @managers AS TABLE(personnelID VARCHAR(10)) 

-- Insert our data for the manager test logic 
INSERT INTO @managers(personnelID) VALUES ('ABC') 
INSERT INTO @managers(personnelID) VALUES ('XYZ') 



SELECT 
    e.* 
FROM 
    Employees AS e 
    inner join @managers as m 
      on e.PersonnelIDList LIKE '%' + m.personnelID + '%' 
WHERE 
    e.QID = @QID 

関連する問題