我试图在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
答案 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
以上假设您的子查询将始终返回单个记录。如果没有,那么你将不得不修复你的逻辑。如果不了解您的数据,就很难提出建议。