1

色のマスター リスト (nvarchar フィールド) があり、小さい色のリストの項目がマスター リスト (nvarchar フィールド) にあるかどうかを確認したい場合。

例: マスター リスト'赤 | オレンジ | 緑 | 青 | 青 | 白い'

  1. "|オレンジ" => true

  2. "|" => true

  3. "| 黒" => true

  4. 「黒 | 黄」 => false

  5. 「黄色」 => false

T-SQLでこれに取り組む最善の方法は何ですか?

ありがとうございました。

4

2 に答える 2

3

テーブル値関数は次のように作成できます。

create table tblMaster(color nvarchar(4000));
insert into tblMaster values ('red | orange | green | blue | white');
Go

-- Create a function to return data as rows of table.
CREATE FUNCTION [dbo].[SplitString](@String varchar(max), @Delimiter char(1))
returns @temptable TABLE (items varchar(max))
as
begin
    declare @idx int
    declare @slice varchar(max)

    select @idx = 1
        if len(@String)<1 or @String is null  return

    while @idx!= 0
    begin
        set @idx = charindex(@Delimiter,@String)
        if @idx!=0
            set @slice = left(@String,@idx - 1)
        else
            set @slice = @String

        if(len(@slice)>0)
            insert into @temptable(Items) values(@slice)

        set @String = right(@String,len(@String) - @idx)
        if len(@String) = 0 break
    end
return
end
Go

次に、次のようにクエリを記述して、目的の結果を取得します。

Declare @color_mstr_list nvarchar(4000),@color_small_list nvarchar(4000);
select @color_mstr_list = color from tblMaster ;

select items into #temp from [dbo].[SplitString](@color_mstr_list,'|');

set @color_small_list = 'red | black';

with cte as
( 
select items from [dbo].[SplitString](@color_small_list,'|')
)
select case when COUNT(*) > 0 then 'True'
            else 'False'
            end  as Result   
from cte 
where exists ( select * from #temp T where T.items = cte.items )

drop table #temp;
于 2013-10-31T06:51:48.120 に答える
2

これは、次を使用した簡単なソリューションです。

  1. リストをテーブルに変換するテーブル値ユーザー定義関数XML nodes() メソッド。
  2. 最初のリストの値が 2 番目のリストに含まれているかどうかをチェックするINTERSECTメソッド

これは関数本体です:

IF EXISTS (SELECT 1 FROM sysobjects WHERE id = object_id(N'fn_ConvertListToNVarcharTable') AND xtype IN (N'FN', N'IF', N'TF'))
BEGIN
    DROP FUNCTION [dbo].[fn_ConvertListToNVarcharTable]
END
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[fn_ConvertListToNVarcharTable] (@List nvarchar(max))
RETURNS @ResultRowset TABLE ([Value] NVARCHAR(250) PRIMARY KEY)
AS
BEGIN
    DECLARE @XML xml = N'<r><![CDATA[' + REPLACE(@List, '|', ']]></r><r><![CDATA[') + ']]></r>'

    INSERT INTO @ResultRowset ([Value])
    SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)')))
    FROM @xml.nodes('//r') Tbl(Col)

    RETURN
END

GO

そして、これはチェックを行う方法です:

IF EXISTS(
    SELECT [Value] 
    FROM[fn_ConvertListToNVarcharTable]('red | orange')
    INTERSECT
    SELECT [Value] 
    FROM [fn_ConvertListToNVarcharTable]('red | orange | green | blue | white')
)
BEGIN
    SELECT 'True'
END
ELSE
BEGIN
    SELECT 'False'
END
于 2013-10-31T09:10:14.870 に答える