コンマ区切りの文字列を含む変数が必要です。
@v1 = 'hello, world, one, two'
@v2 = 'jump, down, yes, one'
少なくとも 1 つの一致がある場合に TRUE を返す関数が必要です。上記の例では、値「one」が両方の文字列にあるため、TRUE が返されます。
これはSQLで可能ですか?
コンマ区切りの文字列を含む変数が必要です。
@v1 = 'hello, world, one, two'
@v2 = 'jump, down, yes, one'
少なくとも 1 つの一致がある場合に TRUE を返す関数が必要です。上記の例では、値「one」が両方の文字列にあるため、TRUE が返されます。
これはSQLで可能ですか?
分割関数を使用します (ここに多くの例があります - SQL Server 2016 より前のほとんどの場合、CLR が最適なオプションになります - 今は使用する必要がありますSTRING_SPLIT()
)。
分割機能があれば、あとは非常に簡単です。モデルは次のようになります。
DECLARE @v1 VARCHAR(MAX) = 'hello, world, one, two',
@v2 VARCHAR(MAX) = 'jump, down, yes, one';
SELECT CASE WHEN EXISTS
(
SELECT 1
FROM dbo.Split(@v1) AS a
INNER JOIN dbo.Split(@v2) AS b
ON a.Item = b.Item
)
THEN 1 ELSE 0 END;
これを減らして、関数を 1 回だけ呼び出すこともできます。
SELECT CASE WHEN EXISTS
(
SELECT 1 FROM dbo.Split(@v1)
WHERE ', ' + LTRIM(@v2) + ','
LIKE '%, ' + LTRIM(Item) + ',%'
) THEN 1 ELSE 0 END;
2016 年以降:
SELECT CASE WHEN EXISTS
(
SELECT 1 FROM STRING_SPLIT(@v1, ',')
WHERE ', ' + LTRIM(@v2) + ','
LIKE '%, ' + LTRIM([Value]) + ',%'
) THEN 1 ELSE 0 END;
CTE を使用して文字列を xml ノードに分割し、単語をテーブル変数に挿入できます。テーブル変数を結合すると、一致が明らかになります
DECLARE @v1 VARCHAR(200) = 'hello, world, one, two'
DECLARE @v2 VARCHAR(200) = 'jump, down, yes, one'
DECLARE @v1Words TABLE (word VARCHAR(100))
DECLARE @v2Words TABLE (word VARCHAR(100))
;WITH cteSplitV1 AS(
SELECT CAST('<word>' + REPLACE(@v1,', ','</word><word>') + '</word>' AS XML) AS words)
INSERT INTO @v1Words(word)
SELECT word.x.value('.','VARCHAR(100)') AS [word]
FROM cteSplitV1
CROSS APPLY words.nodes('/word') AS word(x)
;WITH cteSplitV2 AS(
SELECT CAST('<word>' + REPLACE(@v2,', ','</word><word>') + '</word>' AS XML) AS words)
INSERT INTO @v2Words(word)
SELECT word.x.value('.','VARCHAR(100)') AS [word]
FROM cteSplitV2
CROSS APPLY words.nodes('/word') AS word(x)
SELECT *
FROM @v1Words v1
JOIN @v2Words v2
ON v1.word = v2.word