Sql CTE之后的用例
我试图在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子句的一部分
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。我的观点是,两个版本的查询都会进行完整的表扫描。这通常比像
这样的要昂贵得多——尽管如果字符串很长,字符串操作可能会开始累积。