在THEN表达式中使用CASE语句值

时间:2010-07-29 18:24:10

标签: sql db2 case-expression

我试图使用案例陈述,但不断收到错误。这是声明:

select TABLE1.acct,
        CASE
          WHEN TABLE1.acct_id in (select acct_id 
                                    from TABLE2 
                                group by acct_id 
                                  having count(*) = 1 ) THEN
             (select name 
                from TABLE3 
               where TABLE1.acct_id = TABLE3.acct_id)
          ELSE 'All Others'
        END as Name
   from TABLE1

当我使用文字值替换THEN表达式中的TABLE1.acct_id时,查询有效。当我尝试从查询的WHEN部分使用TABLE1.acct_id时,我得到一个错误,说结果是多行。似乎THEN表达式忽略了WHEN语句使用的单个值。不知道,也许这甚至不能有效地使用CASE声明。

我正在尝试查看在TABLE2中有一个条目的帐户的名称。

任何想法都会受到赞赏,我是SQL的新手。

5 个答案:

答案 0 :(得分:1)

首先,您在TABLE1.acct之后缺少逗号。其次,你将TABLE1别名为acct,所以你应该使用它。

Select acct.acct
    , Case 
        When acct.acct_id in ( Select acct_id 
                                From TABLE2 
                                Group By acct_id 
                                Having Count(*) = 1 ) 
            Then ( Select name 
                    From TABLE3 
                    Where acct.acct_id = TABLE3.acct_id
                    Fetch First 1 Rows Only) 
        Else 'All Others' 
        End as Name 
From TABLE1 As acct

正如其他人所说,你应该调整你的THEN子句以确保只返回一个值。您可以通过将Fetch First 1 Rows Only添加到子查询中来实现。

答案 1 :(得分:1)

Then ( Select name 
       From TABLE3 
       Where acct.acct_id = TABLE3.acct_id
       Fetch First 1 Rows Only) 

在CASE语句中不接受Fetch - “不期望关键字FETCH。有效令牌:”UNION EXCEPT。“

答案 2 :(得分:0)

select name from TABLE3 where TABLE1.acct_id = TABLE3.acct_id

将为您提供表3中的所有名称,这些名称在表1中具有附带的行。从上一行中的表2中选择的行不会进入该行。

答案 3 :(得分:0)

必须获得多个值。

您可以用...替换身体

(select count(name) from TABLE3 where TABLE1.acct_id = TABLE3.acct_id)

...缩小哪些行返回多个。

您可能只需要DISTINCTTOP 1来减少结果集。

祝你好运!

答案 4 :(得分:0)

我认为这里发生的事情是你的案例必须返回一个值,因为它将是“name”列的值。子查询(select acct_id from TABLE2 group by acct_id having count(*) = 1 )是正常的,因为它只会返回一个值。 (select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id)可能会返回多个值,具体取决于您的数据。问题是您尝试将多个值推送到单个行的单个字段中。

接下来要做的是找出哪些数据导致(select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id)返回多行,并查看是否可以进一步限制此查询只返回一行。如果需要,您甚至可以尝试像...AND ROWNUM = 1这样的东西(对于Oracle - 其他DB有类似的方法来限制返回的行)。