1

我需要从 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 次。有人可以提出更好的方法吗?

4

2 回答 2

1

根据您的示例,所有条款的条件都是相同的:

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上找到一个工作示例。

如果我误解了什么,请告诉我,我会尽力纠正;-)

于 2013-07-28T13:48:08.193 回答
0

这可能更适合作为评论,但它太长了。

你的 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

thencase语句似乎正确地捕获了您的逻辑。因为table1.field每行可能会有所不同(而不是整个查询都保持不变),所以我看不到“简化”这一点的方法。

但是,我做了很多假设。您可以使用更好的实际代码示例来修改您的问题。或者删除这个问题,然后用更好的解释重新开始。

于 2013-07-28T12:51:10.780 回答