Как разбить столбец varchar на несколько значений в SQL?

У меня есть этот оператор SQL Select

SELECT 
  AD_Ref_List.Value
FROM AD_Ref_List
WHERE AD_Ref_List.AD_Reference_ID= 1000448

Это результат SELECT:

Как разбить столбец varchar на несколько значений в SQL?

Чтобы ограничить выбранные строки, у меня есть несколько значений, хранящихся в другой таблице, например:

SELECT xx_insert.XX_DocAction_Next
  FROM xx_insert
  WHERE xx_insert_id = 1000283

Как разбить столбец varchar на несколько значений в SQL?

Итак, мой последний выбор 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')

Как я могу это сделать???

С наилучшими пожеланиями

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
103
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Оберните значение в разделитель, который вы используете в списке с разделителями, а затем проверьте, является ли это подстрокой списка с разделителями (также с разделителями, обернутыми вокруг него):

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, '[^,]+' )
);

привет, спасибо за ваш ответ, но я должен сохранить логику в whereClause, например: SELECT somColumns FROM MyTable WHERE myWhereClause AND AD_Ref_List.Value IN

zebiri djallil 02.05.2018 16:09

спасибо, это то, что я хочу, запрос создается автоматически (я не могу добавить только последнюю часть), потому что я говорю, что я должен сохранить порядок

zebiri djallil 02.05.2018 16:26

Вы можете использовать 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 содержит какие-либо специальные символы регулярного выражения, то либо регулярное выражение будет недопустимым, либо может иметь непредвиденное поведение.

MT0 02.05.2018 16:11

Другие вопросы по теме