【问题标题】:How to use CASE clause (DB2) to display values from a different table?如何使用 CASE 子句 (DB2) 显示来自不同表的值?
【发布时间】:2018-07-24 18:45:15
【问题描述】:

我在一家银行工作,所以我不得不调整查询中的列名和信息以适应外部网络,所以如果有任何奇怪的错误知道这有点好。

我正在尝试使用 CASE 子句来显示来自不同表的数据,我知道这是一种解决方法,但由于某些情况我有义务使用它,而且弄清楚是否有实际解决方案。

我收到的以下查询错误是:

"ERROR [21000] [IBM][CLI Driver][DB2] SQL0811N 标量的结果 全查询、SELECT INTO 语句或 VALUES INTO 语句更多 超过一排。”

select  bank_num, branch_num, account_num, client_id,
CASE
    WHEN exists(
        select *
        from bank.services BS
        where ACCS.client_id= BS.sifrur_lakoach
        )

    THEN (select username from bank.services BS where BS.client_id = ACCS.client_id)
        ELSE 'NONE'
            END username_new
from bank.accounts accs
where bank_num = 431 and branch_num = 170

编辑: AFAIK 我们正在使用 DB2 v9.7: DSN11015 - DB21085I 实例“DB2”使用“64”位和 DB2 代码版本“SQL09075” 级别标识符“08060107”。 信息性标记是“DB2 v9.7.500.702”、“s111017”、“IP23287”和 Fix Pack“5”。

【问题讨论】:

  • 检查您是否在 THEN 选择查询中为单个 client_id 获得超过 1 个用户名。另外,当使用 exists 时,只需使用 'select 1' 而不是 'select *'。
  • 那是错误,但是记录太多了。在 JOIN 中显示用户名效果很好。我不知道如何指示 THEN 子句包含所有结果,例如 in() 函数。
  • 你是否厌倦了左外连接?
  • 那么,如果给定的BS.client_id 有多个bank.services 行,您想将其中的哪一个用于username
  • 最好的方法是发布您的示例数据和预期结果。

标签: db2 case


【解决方案1】:

使用 listagg 函数包含所有结果。

select  bank_num, branch_num, account_num, client_id,
CASE
    WHEN exists(
        select *
        from bank.services BS
        where ACCS.client_id= BS.sifrur_lakoach
        )
    THEN (select   LISTAGG(username, ', ') from bank.services BS
         where BS.client_id = ACCS.client_id)
        ELSE 'NONE'
            END username_new
from bank.accounts accs
where bank_num = 431 and branch_num = 170

【讨论】:

  • 阅读 LISTAGG 的文档后,这无疑是答案。但不幸的是,我们使用的是较旧的 DB2 版本,并且 LISTAGG 不是一个公认的函数。 DSN11015 - DB21085I 实例“DB2”使用“64”位和 DB2 代码版本“SQL09075”,级别标识符为“08060107”。信息性标记是“DB2 v9.7.500.702”、“s111017”、“IP23287”和 Fix Pack“5”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多