2

インターネットからいくつかのコードを取得した SQL でコンマ区切りの値を比較する関数を作成しようとしています。

SELECT CASE WHEN EXISTS 
(
  SELECT 1 FROM dbo.Split(@v1)
  WHERE ', ' + LTRIM(@v2) + ',' 
  LIKE '%, ' + LTRIM(Item) + ',%'
) THEN 1 ELSE 0 END;

次に、関数を作成します。

CREATE FUNCTION [dbo].[fnCompareCSVString] 
(   
    @str1 nvarchar(50),
    @str2 nvarchar(50)
)

RETURNS  int
AS
BEGIN
    SELECT CASE WHEN EXISTS 
    (
       SELECT 1 FROM dbo.Split(@str1)
       WHERE ', ' + LTRIM(@str2) + ',' 
         LIKE '%, ' + LTRIM(Item) + ',%'
    ) THEN 1 ELSE 0 END;
END

私は SQL が得意ではありません。これが間違っていることはわかっています。

質問:

比較後に2つの値(カンマ区切り値)を取るカンマ区切り値を比較するための関数を書きたいと思います。戻り値はtrueまたはfalseになります

この SQL 関数で何を変更する必要がありますか?

4

2 に答える 2

1

これはあなたが探しているものですか?

正誤結果

-- matches only those values which exist in both CSV sets
SELECT T1.[Item], CASE  WHEN T2.[Item] IS NULL THEN 0 ELSE 1 END AS [Match] 
FROM [dbo].[Split]('val1,val2,val3', ',') AS T1
    LEFT JOIN [dbo].[Split]('val3,val4', ',') AS T2 on T1.[Item] = T2.[Item]

戻り値

Item    Match
val1    0
val2    0
val3    1

真の一致のみ

-- matches only those values which exist in both CSV sets
SELECT T1.[Item] 
FROM [dbo].[Split]('val1,val2,val3', ',') AS T1
    INNER JOIN [dbo].[Split]('val3,val4', ',') AS T2 on T1.[Item] = T2.[Item]

戻り値

Item
val3

スプリット機能

CREATE FUNCTION [dbo].[Split] 
(   
    @s VARCHAR(max),
    @split CHAR(1)
)
RETURNS @temptable TABLE ([Item] VARCHAR(MAX))    
AS
BEGIN
    DECLARE @x XML

    SELECT @x = CONVERT(xml,'<root><s>' + REPLACE(@s,@split,'</s><s>') + '</s></root>');

    INSERT INTO @temptable          
    SELECT [Value] = T.c.value('.','varchar(20)')
    FROM @X.nodes('/root/s') T(c);
RETURN
END;
于 2013-07-15T11:51:10.227 に答える