TSQL?:操作员功能

TSQL?:操作员功能,tsql,constructor,Tsql,Constructor,我正在寻找与C运算符类似的功能: 我需要根据两个参数筛选服务器端的数据: @CountryID-是逗号分隔值的列表,例如“27,28,81”-表示CountryID 27、CountryID 28和CountryID 81 @关键字以匹配客户名称 有时候,我不想提供一个应该被选中的CountryID的完整列表,而是希望所有的东西都被选中——有点像一个列表。 我创建了一个自定义函数CSV2Table_fn,它允许我提供一个CSV列表,如CountryID DECLARE @CountryIDs n

我正在寻找与C运算符类似的功能:

我需要根据两个参数筛选服务器端的数据:

@CountryID-是逗号分隔值的列表,例如“27,28,81”-表示CountryID 27、CountryID 28和CountryID 81

@关键字以匹配客户名称

有时候,我不想提供一个应该被选中的CountryID的完整列表,而是希望所有的东西都被选中——有点像一个列表。 我创建了一个自定义函数CSV2Table_fn,它允许我提供一个CSV列表,如CountryID

DECLARE @CountryIDs nvarchar(4000), @Keyword nvarchar(50)
SET @CountryIDs = '25,28,81'
SET @Keyword = null


if (len(@Keyword) > 0) -- search for names matching keyword
    begin
    
        SELECT Name, CountryID FROM Company 
                WHERE CountryID IN (
                SELECT DISTINCT ItemValue FROM CSV2Table_fn(
                        ISNULL((SELECT 
                            CASE WHEN (SELECT COUNT(*) FROM (SELECT DISTINCT ItemValue FROM CSV2Table_fn(@CountryIDs,',')) t) > 0   THEN @CountryIDs
                            ELSE null
                            END
                    ),CountryID),',')
            )
            AND Name LIKE '%' + @Keyword + '%'      
            
    end
else -- no keyword provided
    begin
        
        SELECT Name, CountryID FROM Company 
        WHERE CountryID IN (
        SELECT DISTINCT ItemValue FROM CSV2Table_fn(
            ISNULL((SELECT 
                        CASE WHEN (SELECT COUNT(*) FROM (SELECT DISTINCT ItemValue FROM CSV2Table_fn(@CountryIDs,',')) t) > 0   THEN @CountryIDs
                        ELSE null
                        END
                ),CountryID),',')
        )
                end
编辑:代码现在按预期工作。但是这不是很干净,可能需要优化。
你能这样做吗:

SELECT Name, CountryID 
FROM   Company 
WHERE  CHARINDEX(',' + CONVERT(varchar(100), CountryID) + ',', ',' + ISNULL(@CountryIDs, CONVERT(varchar(100), CountryID)) + ',') > 0
AND    Name LIKE '%' + ISNULL(@Keyword, '') + '%'

**编辑为更简单一点,并处理null@CountryIDs参数。

为了允许null和CSV(如“123456789”)作为@CountryIDs的值传入,我使用了以下方法:

 SELECT Name, CountryID FROM Company  
    WHERE CountryID IN ( 
    SELECT DISTINCT ItemValue FROM CSV2Table_fn( 
        ISNULL((SELECT  
                    CASE WHEN (SELECT COUNT(*) FROM (SELECT DISTINCT ItemValue FROM CSV2Table_fn(@CountryIDs,',')) t) > 0   THEN @CountryIDs 
                    ELSE null 
                    END 
            ),CountryID),',') 
    )

请参阅,以获取不要这样做的建议。@CountryIDs变量不是来自客户端,因此我认为这不应该是一个问题?您当前拥有的是该问题的正确解决方案,而不是试图编写一个where。不确定我是否会跟随您;我不能为@CountryID传递一个空值来选择所有内容,这就是我想要完成的。我可以更改选择的不同。。。从CSV2Table中选择DISTINCT ItemValue,类似于isNullValue_fn@CountryIDs,,,,,CountryID,但这仅在我只提供一个CountryID而不是多个CountryID时有效。此更改也适用于null值,但问题仍然存在于多个CountryID。如果不提供null,则此更改将起作用。我设法找到了对原始代码的修复。我还为您提供的代码添加了一个补丁。选择名称、CHARINDEX所在公司的CountryID、“+CASTCountryID为nvarchar+”、“,”、“++@CountryID+”、“>0,以及“%+@Keyword+%”或@Keyword之类的名称为NULL,如果未提供NULL作为什么?CountryID参数、关键字参数或列中的值?如果您想在某些情况下选择所有CountryID,请使用诸如WHERE CHARINDEX'、“+CASTCountryID as nvarchar+”、“、”、“++@CountryID+”、“>0或@CountryID为空,而“%+@Keyword+%”或@Keyword等名称为空。不过,我不能100%确定我是否遵循了这里的要求。如果我想使用CountryID上的WHERE选择所有不过滤的内容,我会执行类似SET@CountryID=null的操作。这对你的第一段代码不起作用,因为你没有测试你的第二段代码。。。让我知道它是否有意义。你的解决方案更简单-我选择了:谢谢你的帮助。