我有这个SQL Select语句
/account/123/login
这是SELECT的结果:
为限制所选行,我在其他表中存储了几个值,如下所示:
SELECT
AD_Ref_List.Value
FROM AD_Ref_List
WHERE AD_Ref_List.AD_Reference_ID= 1000448
所以,我的最终SQL Select是这样的:
SELECT xx_insert.XX_DocAction_Next
FROM xx_insert
WHERE xx_insert_id = 1000283
问题:这个SELECT没有返回任何一行,因为Oracle已经像这样转换了:SELECT
AD_Ref_List.Value
FROM AD_Ref_List
WHERE AD_Ref_List.AD_Reference_ID= 1000448
AND AD_Ref_List.Value IN
(SELECT xx_insert.XX_DocAction_Next
FROM xx_insert
WHERE xx_insert_id = 1000283
)
;
但是,我需要的是:AD_Ref_List.Value IN ('CO,VO')
我该怎么办?
祝你好运
答案 0 :(得分:5)
将值包含在分隔符列表中使用的分隔符中,然后检查它是否是分隔列表的子字符串(也包含分隔符):
SELECT r.Value
FROM AD_Ref_List r
INNER JOIN xx_insert x
ON ( ',' || x.XX_DocAction_Next || ',' LIKE '%,' || r.value || ',%' )
WHERE r.AD_Reference_ID = 1000448
AND x.xx_insert_id = 1000283;
我必须将逻辑保留在whereClause
中
真的,不要。上述查询效率会更高。
但如果你不得不这样做:
SELECT Value
FROM AD_Ref_List
WHERE AD_Reference_ID = 1000448
AND value IN (
SELECT REGEXP_SUBSTR( XX_DocAction_Next, '[^,]+', 1, LEVEL )
FROM xx_insert
WHERE xx_insert_id = 1000283
CONNECT BY LEVEL <= REGEXP_COUNT( XX_DocAction_Next, '[^,]+' )
);
答案 1 :(得分:0)
您可以使用REGEXP_LIKE()
:
SELECT l.value
FROM ad_ref_list l INNER JOIN xx_insert xx
ON REGEXP_LIKE(a.value, '^(' || REPLACE(xx.xx_docaction_Next, ',', '|') || '$' )
WHERE l.ad_reference_id = 1000448
AND xx.xx_insert_id = 1000283;
希望这有帮助。