【问题标题】:Concatenate value into SELECT on a condition根据条件将值连接到 SELECT
【发布时间】:2019-01-13 15:03:18
【问题描述】:

我需要在表中插入一个连接值列表,但如果p_is_broker 变量为真,则需要添加第一个。为简单起见,假设它是真的。

insert into exports (session_id, row_sequence, row_data)
select token,
       1, 'Manager'
          ||','||'Company'
          ||','||'Driver Name'
          ||','||'Registration'
          ||','||'Vehicle'
from dual
union
select token,
       rownum + 1,
       '"'||replace(manager,'"','""')
          ||'","'||replace(company,'"','""')
          ||'","'||replace(driver_name,'"','""')
          ||'","'||replace(registration,'"','""')
from table(cast (p_data as data_t));

如果p_is_broker 为真,我如何插入“经理”?

我尝试过类似的方法,但它不起作用。

 insert into exports (session_id, row_sequence, row_data)
 select token,
        1, (CASE WHEN p_is_broker THEN 'Manager' END)
            ||','||'Company'
            ||','||'Driver Name'
            ||','||'Registration'
            ||','||'Vehicle'
 from dual;

如果有“经理”,我们想要第一个||','||,这变得相当棘手。

【问题讨论】:

  • 为什么要连接字符串文字?为什么不只是'Company,Driver Name,Registration,Vehicle'

标签: sql select plsql insert-into


【解决方案1】:

将逗号移入大小写:

insert into session_csv_Exports (session_id, row_sequence, row_data)
select
  token,
  1,
  (CASE WHEN p_is_broker = 'Y' THEN 'Manager,' ELSE '' END)
  ||'Company'
  ||','||'Driver Name'
  ||','||'Registration'
  ||','||'Vehicle'
from dual;

另外,我想不出任何连接文本字面量的理由。您应该简化为:

insert into session_csv_Exports (session_id, row_sequence, row_data)
select
  token,
  1,
  (CASE WHEN p_is_broker THEN 'Manager,' ELSE '' END)
  || 'Company,Driver Name,Registration,Vehicle'
from dual;

【讨论】:

  • 错误(475,38):PL/SQL:ORA-00920:无效的关系运算符。这是 CASE WHEN 的行。这是为什么?我已经更新了我的初始插入,因为它发生了一些变化。
  • 将 p_is_broker 从 boolean 更改为 varchar2(1) := 'Y' 或 'N',然后检查 p_is_broker = 'Y' 是否已编译。
  • @lazio 对,我忘了 Oracle 没有布尔类型。我更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多