Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql CTE之后的用例_Sql_Sql Server_Tsql_Common Table Expression_Case When - Fatal编程技术网

Sql CTE之后的用例

Sql CTE之后的用例,sql,sql-server,tsql,common-table-expression,case-when,Sql,Sql Server,Tsql,Common Table Expression,Case When,我试图在CTE定义之后使用CASE,但查询仅要求选择: WITH A AS (...) --long query here CASE WHEN @parameter = '' THEN SELECT * FROM A ELSE SELECT * FROM A WHERE field like '%' + @parameter + '%' END 除了使用或语句之外,还有什么方法可以使这个查询工作正常吗?首先,错误时使用CASE。它应该用于返回单个值,而不是表,作为例如select子句的一部分

我试图在CTE定义之后使用
CASE,但查询仅要求
选择

WITH A AS
(...) --long query here
CASE WHEN @parameter = '' THEN
SELECT * FROM A 
ELSE
SELECT * FROM A WHERE field like '%' + @parameter + '%'
END

除了使用
语句之外,还有什么方法可以使这个查询工作正常吗?

首先,错误时使用CASE。它应该用于返回单个值,而不是表,作为例如select子句的一部分。它不打算用作运行两个查询之一的流控制。使用IF

其次,不能从select中拆分CTE,它是同一语句的一部分。您不能说“这是一个CTE,现在从它运行两个语句中的一个”,这不是CTE语句的编写方式。您可以在select中多次重用CTE,但它将运行整个select,而不仅仅是其中的一部分

一些可行的替代方法

可以在整个查询中使用IF,并写出两次。这样,实际运行的查询只有一个版本

IF @parameter = ''
    SELECT (your query here)
ELSE
    SELECT (your query here) WHERE field like ...

您可以使用动态SQL,将查询的第一部分构建为字符串。然后,如果需要,只添加where子句,然后运行生成的SQL。

首先,错误时使用CASE。它应该用于返回单个值,而不是表,作为例如select子句的一部分。它不打算用作运行两个查询之一的流控制。使用IF

其次,不能从select中拆分CTE,它是同一语句的一部分。您不能说“这是一个CTE,现在从它运行两个语句中的一个”,这不是CTE语句的编写方式。您可以在select中多次重用CTE,但它将运行整个select,而不仅仅是其中的一部分

一些可行的替代方法

可以在整个查询中使用IF,并写出两次。这样,实际运行的查询只有一个版本

IF @parameter = ''
    SELECT (your query here)
ELSE
    SELECT (your query here) WHERE field like ...

您可以使用动态SQL,将查询的第一部分构建为字符串。然后仅在需要时添加where子句,然后运行生成的SQL。

您可以在
where
子句中使用

WITH A AS
    (...) --long query here
SELECT *
FROM A
WHERE (field like '%' + @parameter + '%') OR @parameter = '';
如果
字段
从不为
,则这相当于:

WITH A AS
    (...) --long query here
SELECT *
FROM A
WHERE field like '%' + @parameter + '%';

如“%”
匹配任何非空字符串。)

您可以在
WHERE
子句中使用

WITH A AS
    (...) --long query here
SELECT *
FROM A
WHERE (field like '%' + @parameter + '%') OR @parameter = '';
如果
字段
从不为
,则这相当于:

WITH A AS
    (...) --long query here
SELECT *
FROM A
WHERE field like '%' + @parameter + '%';

如“%”
匹配任何非空字符串。)

“除了使用OR语句之外”-为什么要使用
大小写来确定select?为什么不使用
IF/ELSE
?如果从某个应用程序运行此查询并在其中定义@parameter,那么在将查询发送到数据库之前,在应用程序端执行此逻辑。@dbajtr IF在这里不起作用either@Fabio如果
@parameter
不是空的,我不想将整个结果集发送到应用程序“除了使用或声明“-为什么要使用
案例
来确定选择?为什么不使用
IF/ELSE
?如果从某个应用程序运行此查询并在其中定义@parameter,那么在将查询发送到数据库之前,在应用程序端执行此逻辑。@dbajtr IF在这里不起作用either@Fabio如果
@parameter
不可用,我不想将整个结果集发送到应用程序empty@YevgeniGrinberg . . . 对于以通配符开头的
like
模式,我很惊讶对性能的影响是显而易见的。对于
,优化器将忽略
@参数=''
条件,并构建一个计划,对表中的每一行进行比较。当
@parameter
为空时,我想避免使用它。@YevgeniGrinberg。我的观点是,两个版本的查询都会进行完整的表扫描。这通常比像
这样的
要昂贵得多——尽管如果字符串很长,字符串操作可能开始累加。@YevgeniGrinberg。对于以通配符开头的
like
模式,我很惊讶对性能的影响是显而易见的。对于
,优化器将忽略
@参数=''
条件,并构建一个计划,对表中的每一行进行比较。当
@parameter
为空时,我想避免使用它。@YevgeniGrinberg。我的观点是,两个版本的查询都会进行完整的表扫描。这通常比像
这样的
要昂贵得多——尽管如果字符串很长,字符串操作可能会开始累积。