我发送一个由转换为逗号分隔的字符串的int列表到db。 在db上,我需要检查这个字符串参数是否为null,如果它为null我需要检查表中的所有行。如果不为null我选择与字符串参数匹配的行,该参数使用sql函数split函数拆分为表。以下是我的查询。有什么建议可以更好地查询吗?
MM.CheckID IN
(select * from
dbo.fnSplitString((CASE WHEN @listCheckID IS NULL
THEN
(STUFF(( SELECT v.CheckID FROM (SELECT CheckID FROM TABLE1) AS v
ORDER BY v.CheckID
FOR XML PATH('')), 1, 1, ';') + ';') ELSE @listCheckID end), ';'))
最初我在方法1中有查询,我收到错误'选择查询返回多行..'后来我修改了方法2中的查询,它给了我一个拆分值表,我仍然认为这不是一个好的解决方案。
方法1:
CREATE PROCEDURE [dbo].[GetInfo]
@CheckID INT
AS
BEGIN
SELECT
MM.CheckId,
MM.Dept,
MM.Name
FROM
Table1 MM
WHERE
(MM.CheckId IN
(CASE WHEN @CheckID IS NULL THEN (SELECT CheckID from Table1)
ELSE (SELECT * FROM dbo.fnSplitString(@CheckID, ';')) END)
)
END
方法2:
CREATE PROCEDURE [dbo].[GetInfo]
@CheckID INT
AS
BEGIN
SELECT
MM.CheckId,
MM.Dept,
MM.Name
FROM
Table1 MM
WHERE
(MM.CheckId IN
(SELECT * FROM dbo.fnSplitString( (CASE WHEN @CheckID is NUll THEN
(STUFF(( SELECT ';' + cast(v.CheckID AS VARCHAR(50))
FROM (SELECT CheckID FROM Table1) AS v
FOR XML PATH('')), 1, 1, ';') + ';')
ELSE @CheckID end), ';'))
)
END
答案 0 :(得分:1)
我觉得你太复杂了,这就是你所需要的一切
Where (MM.CheckID IN (SELECT CheckID FROM TABLE1) and @listCheckID is null)
or MM.CheckID = @listCheckID
(MM.CheckID IN (SELECT CheckID FROM TABLE1) and @listCheckID is null)
条件仅在@listCheckID
变量为NULL
时才起作用,因为中间使用了AND
运算符。
当@listCheckID
变量为NOT NULL
时,此or MM.CheckID = @listCheckID
条件将提取与变量匹配的值。
发布完整查询后,您可能会获得更好的解决方案
更新:似乎这就是您所需要的一切
SELECT MM.CheckId,
MM.Dept,
MM.NAME
FROM Table1 MM
WHERE MM.CheckId IN (SELECT * --select the column name
FROM dbo.Fnsplitstring(@CheckID, ';'))
OR @CheckID IS NULL -- to return all the records when @CheckID is NULL
答案 1 :(得分:0)
不知道你在那个片段中做了什么。通常,您使用以下方法:
where MM.CheckID in (select ? from dbo.fnSplitString(@listCheckID))
or @listCheckID is null
...;
问号是占位符 - 将其替换为split函数返回的表中列的名称。 不通过使用星号(*)选择每一列来启动延迟/错误的编程实践 - 即使表只有一列。事情随着时间而变化;使您的代码具有弹性。