在Oracle

时间:2019-04-18 09:29:02

标签: sql oracle split

我试图在Oracle SQL Developer中用逗号分隔的字符串转义单引号,以下是我的Select查询:

SELECT (CASE WHEN PS.SUPPLIER_NO IS NULL THEN 'FALSE' ELSE 'TRUE' END) AS "Check"
      ,dm."branch_id", dm."SUPPLIER_NO", dm."supplier_name", dm."date_created"
      ,dm."vendor_no", dm."ORDERING_ADDRESS_1", dm."ORDERING_ADDRESS_2"
      ,dm."ORDERING_CITY", dm."ORDERING_STATE_COD", dm."ORDERING_ZIP"
      ,dm."country_code", dm."fax_area_code", dm."fax_no", dm."fax_extension"
FROM datamart.udm_supplier_dim@teradata.wesco.com dm
LEFT JOIN PROJECT_SUPPLIERS PS ON PS.SUPPLIER_NO = dm."SUPPLIER_NO"
 AND PS.BRANCH_ID = dm."branch_id"
 AND PS.PROJECT_ID = 'e82a654af6c64e8297576b88b5eff138'
WHERE dm."branch_id" IN (REPLACE('6218, 5577','''',''''''));

我试图替换/转义Where IN子句中的单引号,但它给出了无效数字的错误。

  

ORA-01722:无效的数字

当我尝试使用其他选择语句中的replace选择相同的字符串时,它正在工作。

select REPLACE('6218, 5577','''','''''') from dual;

上面的查询按预期工作,并且将o / p设为'6218, 5577'

任何人都可以提出建议,为什么它在我的主要Select语句中不起作用?

1 个答案:

答案 0 :(得分:2)

'6218, 5577',这是一个字符串,而不是值列表。因此,如果您执行select REPLACE('6218, 5577','''','''''') from dual;,则尝试替换字符串中的单引号。由于它在您的字符串中不存在,因此不会替换任何内容。

您选择的结果仍然是相同的字符串,而不是您期望的列表。

您应该将逗号分隔的字符串分成几行。

这是一种实现方法

with tab as (
  SELECT trim(regexp_substr('6218, 5577', '[^,]+', 1, LEVEL)) str
   FROM dual
   CONNECT BY instr('6218, 5577', ',', 1, LEVEL - 1) > 0
) 

比您可以在选择中使用它

with tab as (
  SELECT trim(regexp_substr('6218, 5577', '[^,]+', 1, LEVEL)) str
   FROM dual
   CONNECT BY instr('6218, 5577', ',', 1, LEVEL - 1) > 0
) 
select ...
  from ...
  WHERE dm."branch_id" IN (select str from tab );