Sql server 2008 T-SQL:检查小列表中的项目是否在大列表中

Sql server 2008 T-SQL:检查小列表中的项目是否在大列表中,sql-server-2008,tsql,Sql Server 2008,Tsql,如果我有一个颜色的主列表(nvarchar字段),我想检查小颜色列表中的任何项目是否在主列表(nvarchar字段)中 e、 g.主列表红色|橙色|绿色|蓝色|白色 “红色|橙色”=>正确 “白色|绿色”=>正确 “红色黑色”=>正确 “黑|黄”=>假 “黄色”=>错误 在T-SQL中解决这个问题的最佳方法是什么 谢谢。您可以创建一个表值函数,如下所示: create table tblMaster(color nvarchar(4000)); insert into tblMaster val

如果我有一个颜色的主列表(nvarchar字段),我想检查小颜色列表中的任何项目是否在主列表(nvarchar字段)中

e、 g.主列表红色|橙色|绿色|蓝色|白色

  • 红色|橙色”=>正确

  • 白色|绿色”=>正确

  • 红色黑色”=>正确

  • “黑|黄”=>假

  • “黄色”=>错误

  • 在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
    

    您可以创建表值函数,如下所示:

    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
    

    这是一个简单的解决方案,使用:

  • 并将列表转换为表
  • 方法检查第一个列表中的值是否包含在第二个列表中
  • 这是功能体:

    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 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
    

    在T-SQL中解决这个问题的最佳方法是什么?以关系格式存储数据。抱歉,我无法更改现有的数据格式。在T-SQL中解决此问题的最佳方法是什么?以关系格式存储数据。很抱歉,我无法更改现有的数据格式。+1,尽管我会检查为一行,因此它也可以在上使用tables@t-克劳森:这是很好的观点。在某些情况下,内联用户函数可以提供比多行函数更好的性能。+1虽然我会检查单行函数,所以它也可以用于tables@t-克劳森:这是很好的观点。在某些情况下,内联用户函数可以提供比多行函数更好的性能。