我有这个PL / SQL代码片段RESTALLSEQUENCENUMBERLIST包含值'2,3,4'我将其转换为'2','3','4'为第三行中的in子句中的第二个声明。但是我的更新查询给了我无效的号码。有人可以帮忙吗
restAllSequenceNumberInList varchar2(100);
SELECT
'''' || REPLACE( RESTALLSEQUENCENUMBERLIST, ',', ''',''' ) || ''''
into restAllSequenceNumberInList FROM DUAL;
UPDATE THIRD_PARTY_LOOKUP
SET ADDRESS_ID = firstSequenceNumber
WHERE ADDRESS_ID in (RESTALLSEQUENCENUMBERINLIST);
答案 0 :(得分:1)
in
子句不接受表示多个值的字符串参数。它是如此简单。如果您将单个字符串传递给in
,则其行为与=
相同。
您可以使用like
:
UPDATE THIRD_PARTY_LOOKUP
SET ADDRESS_ID = firstSequenceNumber
WHERE ','||ADDRESS_ID||',' LIKE '%,' || RESTALLSEQUENCENUMBERLIST || '%,';
但是,不是将列表存储在字符串中,为什么不将它们存储在临时表中?毕竟,表是为存储事物列表而明确设计的SQL构造。
答案 1 :(得分:0)
你不能在变量中传递逗号分隔列表并假设SQL将它们视为单独的值,试试这个
--replace with " not '
SELECT
REPLACE '''' || REPLACE( RESTALLSEQUENCENUMBERLIST, ',', '","' ) || ''''
into restAllSequenceNumberInList FROM DUAL;
--use xml to split them into rows
UPDATE THIRD_PARTY_LOOKUP
SET ADDRESS_ID = firstSequenceNumber
WHERE ADDRESS_ID in
(SELECT EXTRACTVALUE(COLUMN_VALUE,'text()') VALS
FROM XMLTABLE(restAllSequenceNumberInList) )
答案 2 :(得分:0)
使用包含列表的单个字符串是不可能的。您需要使用以这种或那种方式拆分字符串生成的列表。不幸的是,没有“简单”的分割功能。有几种方法。