在 SQL 中使用 IF/ELSE 重复 CASE 块
Posted
技术标签:
【中文标题】在 SQL 中使用 IF/ELSE 重复 CASE 块【英文标题】:Repeat CASE block with IF/ELSE in SQL 【发布时间】:2013-07-28 03:47:23 【问题描述】:我需要从 SQL Server 存储过程生成报告,其中条件相同但 10 列的结果不同。
我为此使用 CASE 语句。每个 CASE 中还有 IF/ELSE 块。此 IF/ELSE 块从不同的列中提取数据。
我将相同的 CASE 语句重复 10 次,如下所示:
SELECT
CASE WHEN table1.Field="aa"
THEN
select table2.Field
ELSE
select table3.Field
END as 'FirstColumn',
CASE WHEN table1.Field="aa"
THEN
select table4.Field
ELSE
table5.Field END as 'SecondColumn'
这样我不得不重复同样的 CASE 语句 10 次。有人可以提出更好的方法吗?
【问题讨论】:
table1, table2, ... , tableN 有相同的架构吗? 是的,所有架构都相同 你为什么不做一些你可以JOIN
in的查找表?
我该怎么做?你能举个例子或分享一些链接吗?
能否请您显示整个查询,尤其是 from 子句
【参考方案1】:
这可能更适合作为评论,但它太长了。
您的 SQL 没有意义。 when
子句中有没有括号的子查询,因此这不是有效的 SQL。此外,字符串周围有双引号,这意味着 "aa"
被解释为列引用,而不是常量。最后,列别名周围有单引号,虽然允许,但这是不好的做法。
我也不知道“每个 CASE 中都有 IF/ELSE 块”是什么意思,因为 SQL 也不允许这样做。
如果你的意思是:
select (CASE WHEN table1.Field = 'aa' THEN table2.Field
ELSE table3.Field
END) as FirstColumn,
(CASE WHEN table1.Field = 'aa' then table4.Field
ELSE table5.Field
END) as SecondColumn
然后case
语句似乎正确地捕获了您的逻辑。因为table1.field
可能因每一行而异(而不是在整个查询中保持不变),所以我看不到“简化”这一点的方法。
但是,我做了很多假设。您可以使用更好的实际代码示例来修改您的问题。或者删除这个问题,然后用更好的解释重新开始。
【讨论】:
【参考方案2】:根据您的示例,所有子句的条件都是相同的:
table1.Field="aa"
如果这个假设是正确的,我会建议一种不同的方法来解决这个问题。 创建 2 个查询,每个查询一个,并使用 IF ELSE 语法在它们之间切换。
类似这样的:
DECLARE @Var varchar(2)
SELECT @Var = Field
FROM table1 IF @Var = 'aa' BEGIN
SELECT table2.Field AS 'FirstColumn',
table4.Field AS 'SecondColumn'
FROM table2,
table4 END
ELSE BEGIN
SELECT table3.Field AS 'FirstColumn' ,
table5.Field AS 'SecondColumn'
FROM table3,
table5 END
您可以在 SQLFiddle 上找到一个工作示例。
如果我误解了什么,请告诉我,我会尽力纠正;-)
【讨论】:
以上是关于在 SQL 中使用 IF/ELSE 重复 CASE 块的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server判断语句(IF ELSE/CASE WHEN )
在oracle sql语句里有没有if...else...的用法,请各位大侠给个例子看看,灰常感谢!!