我试图在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语句中不起作用?
答案 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 );