我希望在 WHERE IN 條件下使用一組值。
經過研究,我發現我必須制作一個“CREATE TYPE”,因為本地的“TYPE”不起作用。這個解決方案不適合我,我不想在 Oracle 中創建新的 TYPE,因為資料庫用于 ERP/PGI,我不希望污染我的小需求。
我的要求如下:
DELETE vip_routage
WHERE vip_tel_ext = w_array_tel(i)
AND ((w_cp NOT IN ('14', '27', '50', '61', '76')
AND SUBSTR(VIP_CODE_POSTAL, 1, 2) IN ('14', '27', '50', '61', '76'))
OR (w_cp IN ('14', '27', '50', '61', '76')
AND SUBSTR(VIP_CODE_POSTAL, 1, 2) IN ('14', '27', '50', '61', '76')
AND TO_NUMBER(vip_dest1) < w_tri_ordre)
OR (w_cp NOT IN ('14', '27', '50', '61', '76')
AND SUBSTR(VIP_CODE_POSTAL, 1, 2) NOT IN ('14', '27', '50', '61', '76')
AND TO_NUMBER(vip_dest1) < w_tri_ordre));
我想將值“('14','27','50','61','76')”設定為變數,但僅在我的程式中。
除了“CREATE TYPE”,你還有什么想法嗎?
uj5u.com熱心網友回復:
由于您不想創建自己的型別,請使用內置的 - sys.odcivarchar2list。例如,獲取文員或經理的員工:
SQL> select deptno, empno, ename, job, sal
2 from emp
3 where job in (select *
4 from table(sys.odcivarchar2list('CLERK', 'MANAGER'))
5 );
DEPTNO EMPNO ENAME JOB SAL
---------- ---------- ---------- --------- ----------
10 7934 MILLER CLERK 1300
30 7900 JAMES CLERK 950
20 7876 ADAMS CLERK 1100
20 7369 SMITH CLERK 800
10 7782 CLARK MANAGER 2450
30 7698 BLAKE MANAGER 2850
20 7566 JONES MANAGER 2975
7 rows selected.
SQL>
uj5u.com熱心網友回復:
將第一個 with 子句和 str 替換為您的字串變數,您可以執行以下操作:
with rws as (
select '''14'',''27'',''50'',''61'',''76''' str from dual
),
item_list as (
select regexp_substr (
str,
'[^,] ',
1,
level
) value
from rws
connect by level <=
length ( str ) - length ( replace ( str, ',' ) ) 1
)
delete from VIP_ROUTAGE
where vip_TEL_EXT = w_array_tel(i)
AND (
(w_cp NOT IN (select value from item_list)) ...
uj5u.com熱心網友回復:
您可以傳入一個字串(例如'14,27,50,61,76')作為系結變數,并用于LIKE比較分隔字串:
DELETE FROM VIP_ROUTAGE
WHERE vip_TEL_EXT = w_array_tel(i)
AND ( ',' || :your_list || ',' NOT LIKE '%,' || w_cp || ',%'
AND ( ',' || :your_list || ',' LIKE '%,' || SUBSTR(VIP_CODE_POSTAL,1,2) || '%,'
OR to_number(vip_dest1) < w_tri_ordre))
OR ( ',' || :your_list || ',' LIKE '%,' || w_cp || ',%'
AND ',' || :your_list || ',' LIKE '%,' || SUBSTR(VIP_CODE_POSTAL,1,2) || ',%'
AND to_number(vip_dest1) < w_tri_ordre)
db<>在這里擺弄
uj5u.com熱心網友回復:
如果您希望將此代碼串列作為純文本(而不是作為集合型別的系結變數)傳??遞,那么您可以使用json_table函式將串列擴展為表并將其用作帶有in謂詞內的子查詢的通用表:
with function f /*Just to emulate bind variable*/ return varchar2 as begin return q'('X','Y','Z')'; end; lkp as ( select * from json_table( '[' || /* Your string goes here instead of invocation f() */ f() || ']', '$[*]' columns ( col varchar2(100) path '$' ) ) ) select * from dual where dummy in ( /*Filter by list*/ select * from lkp )| 假人 | | :---- | | X |
db<>在這里擺弄
如果您想將此代碼作為陣列(Oracle 中的集合)傳遞,則使用內置集合型別sys.odcivarchar2list,但您需要根據編程語言在應用程式端準備此型別的系結變數(例如,這是Python 官方檔案中示例的解釋)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429535.html
