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 1
或group 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 表达式中的子查询的主要内容,如果未能解决你的问题,请参考以下文章