色のマスター リスト (nvarchar フィールド) があり、小さい色のリストの項目がマスター リスト (nvarchar フィールド) にあるかどうかを確認したい場合。
例: マスター リスト'赤 | オレンジ | 緑 | 青 | 青 | 白い'
"赤|オレンジ" => true
"白|緑" => true
"赤| 黒" => true
「黒 | 黄」 => false
「黄色」 => false
T-SQLでこれに取り組む最善の方法は何ですか?
ありがとうございました。
色のマスター リスト (nvarchar フィールド) があり、小さい色のリストの項目がマスター リスト (nvarchar フィールド) にあるかどうかを確認したい場合。
例: マスター リスト'赤 | オレンジ | 緑 | 青 | 青 | 白い'
"赤|オレンジ" => true
"白|緑" => true
"赤| 黒" => true
「黒 | 黄」 => false
「黄色」 => false
T-SQLでこれに取り組む最善の方法は何ですか?
ありがとうございました。
テーブル値関数は次のように作成できます。
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;
これは、次を使用した簡単なソリューションです。
これは関数本体です:
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