0

我正在寻找类似于 C# 运算符的功能?:https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator

我需要根据两个参数过滤服务器端的数据:

  1. @CountryIDs - 这是逗号分隔值的列表,例如 '27,28,81' - 表示 CountryID 27、CountryID 28 和 CountryID 81

  2. @Keyword 匹配客户名称。

有时我不想提供应选择的 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
  • 编辑:代码现在按预期工作。然而,这不是很干净,可能会被优化。
4

2 回答 2

1

你能做这样的事情吗:

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 参数。

于 2012-07-04T16:08:20.287 回答
0

为了允许将 null 和像 '123,456,789' 这样的 CSV 作为 @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),',') 
    )
于 2012-07-04T17:43:59.497 回答