代码之家  ›  专栏  ›  技术社区  ›  Black

SQL Server中case语句内的条件

  •  1
  • Black  · 技术社区  · 6 年前

    我有一个查询要从Postgres(10.1)迁移到Microsoft SQL Server(13.0)

    在Postgres中工作的查询位于:

    SELECT * 
    FROM source
    WHERE
        1 = CASE 
               WHEN 234 NOT IN (SELECT user_id
                                FROM usergroup)
                  THEN SOURCE .source_id IN (SELECT DISTINCT sl.source_id
                                             FROM sourcelevel SL)
                  ELSE 1
            END
    

    SQL Server失败,并显示以下错误消息:

    消息156,15级,状态1,第11行
    关键字“in”附近有语法错误。

    这个问题似乎源于 IN 条件 CASE/WHEN/ELSE/END ,因为如果在生成查询时移除该构造:

    SELECT * 
    FROM source
    WHERE
        SOURCE .source_id IN (SELECT DISTINCT sl.source_id
                              FROM sourcelevel SL)
    

    它执行无误。

    有什么技巧可以用吗 内部语法 CASE SQL Server语句?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Dan Guzman    6 年前

    Boolean

    SELECT * from source
    WHERE
        1 =
             CASE WHEN 234 NOT IN(
                SELECT  
                    user_id
                FROM
                    usergroup  
                )
            THEN
                CASE WHEN SOURCE.source_id IN(
                    SELECT DISTINCT
                        sl.source_id
                    FROM
                    sourcelevel SL
    
                ) THEN 1 
                  ELSE 0
                 END
    
            ELSE
                1
            END;
    

    CASE

    SELECT *
    FROM source
    WHERE 234 IN(
        SELECT user_id
        FROM usergroup  
        )
        OR 
        SOURCE.source_id IN(
            SELECT sl.source_id
            FROM sourcelevel SL
        );
    
        2
  •  0
  •   marc_s    6 年前

    NOT IN

    THEN SOURCE .source_id IN (SELECT DISTINCT sl.source_id
                               FROM sourcelevel SL)
    

    WHERE 1 = SOURCE.source_id IN (SELECT..
    

    SELECT * 
    FROM source
    WHERE 1 = (CASE WHEN 234 NOT IN(SELECT user_id FROM usergroup)
                       THEN SOURCE.source_id IN (SELECT DISTINCT sl.source_id FROM sourcelevel AS SL)
                       ELSE 1
               END)
    

    CASE IF

    IF (SELECT user_id FROM usergroup WHERE user_id = 234) IS NULL  
    BEGIN
        SELECT * 
        FROM source
        WHERE source.source_id IN (SELECT DISTINCT sl.source_id FROM sourcelevel AS SL)
    END
    ELSE BEGIN
        SELECT * FROM source
    END
    
        3
  •  0
  •   TomC    6 年前

    SELECT * FROM source
    WHERE exists(select * from usergroup where user_id=@u)
    or exists(select * from sourcelevel sl where sl.source_id=source.Sourceid)