在同一个查询中使用 WITH 和 IF

jua*_*han 5 sql-server sql-server-2012

我正在尝试使用WITH子句和IF语句,但它似乎不起作用,我找不到任何原因。语法应该是正确的,但它仍然在抱怨语法。

我收到的错误是“';'附近的语法不正确。我尝试删除;字符,但后来显示“关键字'IF'附近的语法不正确。

甚至可以像这样使用 WITH 和 IF 语法吗?该查询在没有IF语句的情况下也能工作(只有一个选择查询)。

With measurements as 
        (
        (SELECT * from measurement_database1)
        UNION ALL
        (SELECT * from measurement_database2)
        UNION ALL
        (SELECT * from measurement_database3)
        );

    IF @device= 'en1' AND @other_parameter= 'yes'
        (
        select * from measurements where device like 'en1' and op like 'yes'
            );
    IF @device= 'en2' AND @other_parameter= 'no'
        (
        select * from measurements where device like 'en2' and op like 'no'
            );
    IF @device= 'en3' AND @other_parameter= 'yes'
        (
        select * from measurements where device like 'en3' and op like 'yes'
            );
Run Code Online (Sandbox Code Playgroud)

我正在运行 Microsoft SQL Server 2012 11.0.6607.3。

Sha*_*eis 15

如果您考虑一下,它可能会帮助您更多,而不是作为 WITH 语句,而是作为公共表表达式 (CTE)。

这样你就可以回到CTE 上的 Microsoft 文档并阅读以下行;

CTE 后面必须跟一个引用部分或全部 CTE 列的 SELECT、INSERT、UPDATE 或 DELETE 语句。CTE 也可以在 CREATE VIEW 语句中指定为视图的定义 SELECT 语句的一部分。

尽管从技术上讲,您可以定义 CTE,然后根本不引用它,但是定义它有什么意义呢?例如

WITH Missing AS (SELECT 'The Point' AS What)
SELECT * FROM sys.messages;
Run Code Online (Sandbox Code Playgroud)

回到你的案例,你可以使用CASE语句而不是语句来重写它,IF又有什么意义呢?你不需要它们。

您的查询可以重写为:

DECLARE @device char(3) = 'en3',
        @other_parameter varchar(3) = 'yes';
WITH measurements AS (
                         (SELECT    *
                          FROM  measurement_database1)
                         UNION ALL
                         (SELECT    *
                          FROM  measurement_database2)
                         UNION ALL
                         (SELECT    *
                          FROM  measurement_database3)
                     )
SELECT  *
FROM    measurements
WHERE   device LIKE @device
  AND   op LIKE @other_parameter;
Run Code Online (Sandbox Code Playgroud)

所以根本不需要IF声明!HTH

  • 是的。每当我在 SQL 中看到 `IF` 时,我的第一反应几乎令人窒息。我的第二反应通常是撕掉它。IF 语句在适当的基于集合的 SQL 中非常非常少。 (5认同)
  • @Brad - 不知道 - 我认为它*可能*只是在解析时发生的简单检查。 (2认同)