У меня есть этот оператор SQL Select
SELECT
AD_Ref_List.Value
FROM AD_Ref_List
WHERE AD_Ref_List.AD_Reference_ID= 1000448
Это результат SELECT:
Чтобы ограничить выбранные строки, у меня есть несколько значений, хранящихся в другой таблице, например:
SELECT xx_insert.XX_DocAction_Next
FROM xx_insert
WHERE xx_insert_id = 1000283
Итак, мой последний выбор SQL таков:
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
)
;
ПРОБЛЕМА: этот SELECT не возвращает никакой строки, потому что Oracle преобразовал следующим образом: AD_Ref_List.Value IN ('CO,VO')
Но мне нужно: AD_Ref_List.Value IN ('CO','VO')
Как я могу это сделать???
С наилучшими пожеланиями
Оберните значение в разделитель, который вы используете в списке с разделителями, а затем проверьте, является ли это подстрокой списка с разделителями (также с разделителями, обернутыми вокруг него):
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;
i must keep the logic in the 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, '[^,]+' )
);
спасибо, это то, что я хочу, запрос создается автоматически (я не могу добавить только последнюю часть), потому что я говорю, что я должен сохранить порядок
Вы можете использовать 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;
Надеюсь это поможет.
Если xx.docaction_next
содержит какие-либо специальные символы регулярного выражения, то либо регулярное выражение будет недопустимым, либо может иметь непредвиденное поведение.
привет, спасибо за ваш ответ, но я должен сохранить логику в whereClause, например: SELECT somColumns FROM MyTable WHERE myWhereClause AND AD_Ref_List.Value IN