Microsoft Sql Case stmt使用的东西

时间:2018-01-21 00:22:06

标签: sql sql-server

我发送一个由转换为逗号分隔的字符串的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

2 个答案:

答案 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函数返回的表中列的名称。 通过使用星号(*)选择每一列来启动延迟/错误的编程实践 - 即使表只有一列。事情随着时间而变化;使您的代码具有弹性。