db2中CASE表达式中的子查询

时间:2018-02-21 09:13:16

标签: sql db2 subquery case

我试图在CASE表达式中使用子查询但是失败了。我正在使用DB2,我使用银行数据库并尝试选择拥有帐户或没有帐户的所有客户(客户类型5)。 如果他们确实有活动帐户,那么我想将该帐户显示为1列而不是3列。 我确实知道我可以使用OUTER JOIN做这样的事情,但我最好尽可能地掌握CASE表达式。 我感谢任何帮助;)

select  internal_id, bank_num, identity_number, type_of_identity,
    country_id, activity_status
CASE
    WHEN activity_status = 0 THEN 'INACTIVE'
    WHEN activity_status = 1 THEN (
select  bank_num ||'-'|| branch_num||'-'|| account_num as acc 
from    atlmn.atala021 LA02 
where   LA02.internal_id = L100.internal_id)
    ELSE 'null'
    END activity
from    atlmn.atal1001 L100 
where   bank_num = 10
and type_of_client = 5

我收到了以下错误:

  

错误[21000] [IBM] [CLI驱动程序] [DB2] SQL0811N标量全查询,SELECT INTO语句或VALUES INTO语句的结果不止一行。 SQLSTATE = 21000

1 个答案:

答案 0 :(得分:0)

我发现您的代码存在两个潜在问题。首先,选择列表中的activity_status后面缺少逗号。其次,如果CASE表达式中的子查询可能返回多个记录,那么它肯定会导致错误。这是更正后的版本:

SELECT
    internal_id,
    bank_num,
    identity_number,
    type_of_identity,
    country_id,
    activity_status,    -- added a comma here
    CASE
        WHEN activity_status = 0 THEN 'INACTIVE'
        WHEN activity_status = 1 THEN
        (
            SELECT bank_num ||'-'|| branch_num||'-'|| account_num  -- no alias needed
            FROM atlmn.atala021 LA02 
            WHERE LA02.internal_id = L100.internal_id
        )
        ELSE 'null'
    END activity
FROM atlmn.atal1001 L100 
WHERE
    bank_num = 10 AND type_of_client = 5

以上假设您的子查询将始终返回单个记录。如果没有,那么你将不得不修复你的逻辑。如果不了解您的数据,就很难提出建议。