db2 中 CASE 表达式中的子查询

Posted

技术标签:

【中文标题】db2 中 CASE 表达式中的子查询【英文标题】:sub-query in a CASE expression in db2 【发布时间】:2018-02-21 09:13:15 【问题描述】:

我正在尝试在 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 Driver][DB2] SQL0811N 标量全查询、SELECT INTO 语句或 VALUES INTO 语句的结果多于一行。 SQLSTATE=21000

【问题讨论】:

“我可以使用 OUTER JOIN 来做这样的事情,但我宁愿尽可能地掌握 CASE 表达式”......这是一个糟糕的性能选择。在 100 万条记录选择中,您将执行 1000001 次表访问(主查询 1 次,每行额外 100 万次)。掌握联接很棘手,但可以帮助您解决很多问题 我同意@bradbury9,但性能不是问题。我想正确地学习语法,当最终涉及到性能时,我肯定会使用最有效的方法。 问题不是你的语法,而是返回多条记录的子查询的逻辑。 然后您可以在子选择中执行TOP 1group by 以确保只返回一行,但没有样本数据很难知道重写它的最佳方法。 【参考方案1】:

我发现您的代码存在两个潜在问题。首先,选择列表中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

再次假设您的子查询将始终返回一条记录。如果没有,那么你将不得不修正你的逻辑。如果不知道您的数据,就很难提出建议。

【讨论】:

缺少逗号,因为我必须调整整个查询以适应 ***,因为列名是我们的语言,所以您更难理解内部逻辑,因此我必须简化它。在这样做的同时,我错过了一个逗号。无论如何,我发现了问题所在。每个客户可以拥有多个帐户,因此子查询将提供多条记录而不是一条记录。感谢您的帮助;) 然后我们需要找到子查询的修复。将其编写为连接可能会绕过该错误,但您的结果集中仍然可能有不需要的重复项。

以上是关于db2 中 CASE 表达式中的子查询的主要内容,如果未能解决你的问题,请参考以下文章

sql语句update语句中嵌套的子查询该怎么写?

Case when 条件下来自另一个表的子查询

数据库三级

带有case语句的bigquery中的子选择

如何在 DB2 中获取字符分隔的子字符串?

错误:用作表达式的子查询返回多行。 POSTGRESQL / 查看器