TSQL?:操作员功能
我正在寻找与C运算符类似的功能: 我需要根据两个参数筛选服务器端的数据: @CountryID-是逗号分隔值的列表,例如“27,28,81”-表示CountryID 27、CountryID 28和CountryID 81 @关键字以匹配客户名称 有时候,我不想提供一个应该被选中的CountryID的完整列表,而是希望所有的东西都被选中——有点像一个列表。 我创建了一个自定义函数CSV2Table_fn,它允许我提供一个CSV列表,如CountryIDTSQL?:操作员功能,tsql,constructor,Tsql,Constructor,我正在寻找与C运算符类似的功能: 我需要根据两个参数筛选服务器端的数据: @CountryID-是逗号分隔值的列表,例如“27,28,81”-表示CountryID 27、CountryID 28和CountryID 81 @关键字以匹配客户名称 有时候,我不想提供一个应该被选中的CountryID的完整列表,而是希望所有的东西都被选中——有点像一个列表。 我创建了一个自定义函数CSV2Table_fn,它允许我提供一个CSV列表,如CountryID DECLARE @CountryIDs n
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的操作。这对你的第一段代码不起作用,因为你没有测试你的第二段代码。。。让我知道它是否有意义。你的解决方案更简单-我选择了:谢谢你的帮助。