SQL: подача выходных данных SELECT в LIKE - PullRequest
7 голосов
/ 21 марта 2012

Проблема:

select STR1 from T1 where STR2 = 'NAME1'

В приведенном выше запросе STR1 может иметь вид {ABC, ABC_1, ABC_2, ..., MNO, XYZ, XYZ_1 ...}.

Итак, предположим, что у меня есть следующий вывод

ABC_1
MNO
XYZ

Теперь я хочу извлечь все те соответствия STR1, которые включают деталь до _ # .Например, ожидаемый результат для вышеприведенного примера набора данных:

ABC
ABC_1
ABC_2

MNO

XYZ
XYZ_1

Обратите внимание, что STR2 всегда уникален для STR1.

В отношении кода я представляю что-то вроде следующего:

SELECT 
    STR1 
FROM 
    T1 
WHERE
    STR1 
LIKE '% (truncate_underscore_part(select STR1 from T1 where STR2 = 'NAME1')) %'

Есть идеи?

Первое решение:

select t1.str1
  from (
  select case when instr( str1, '_' ) > 0
                then substr( str1, 1, instr( str1, '_' ) - 1 )
              else str1
         end prefix
    from t1 where str2 = 'NAME1'
) prefix_list,
  t1
  where t1.str1 like prefix || '%'

Ответы [ 3 ]

1 голос
/ 21 марта 2012
with prefix_list as (
  select regexp_substr( str1, '^[A-Z]*' ) prefix from t1 where str2 = 'NAME1'
)
select t1.str1 from t1 join prefix_list
        on t1.str1 = prefix_list.prefix
           or regexp_like( t1.str1, prefix_list.prefix||'_[0-9]' )

Чтобы сделать это без функций регулярного выражения (для более старых версий Oracle), немного зависит от того, насколько вы хотите проверить формат строк.

select t1.str1
  from (
  select case when instr( str1, '_' ) > 0
                then substr( str1, 1, instr( str1, '_' ) - 1 )
              else str1
         end prefix
    from t1 where str2 = 'NAME1'
) prefix_list,
  t1
where t1.str1 = prefix
   or t2.str1 like prefix || '\__' escape '\'
0 голосов
/ 22 марта 2012

В Oracle я бы использовал

where regexp_like(str1, '[A-Z]{3}(_[0-9]+)?')
0 голосов
/ 21 марта 2012

Один из способов сделать это - самообъединение.

Вот пример для MySQL:

SELECT t2.str1
FROM t1 
  INNER JOIN T1 as t2 on (t2.str1 = t1.str1 OR t2.str1 LIKE CONCAT(t1.str1,'\_%'))
WHERE t1.STR2 = 'NAME1'

А вот попытка перевести это на синтаксис Oracle:

SELECT t2.str1
FROM t1 
  INNER JOIN T1 as t2 on (t2.str1 = t1.str1 OR t2.str1 LIKE t1.str1 || '\_%')
WHERE t1.STR2 = 'NAME1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...