Oracle - Как использовать строковые данные в (в операторе) - PullRequest
1 голос
/ 26 мая 2020

В tbl_1 у меня есть:

id
1
2
3
4
5
6
7
8
9

in tbl_2:
id  value
1   1,2,3
2   5

Select * from tbl_1, где id in (выбрать значение из tbl_2, где id = 2); - ОК

Выбрать * из таблицы_1, где идентификатор в (выбрать значение из таблицы_2, где идентификатор = 1);

--Need this resault: 3 rows:  1, 2 and 3

Ответы [ 3 ]

4 голосов
/ 26 мая 2020

Исправьте вашу модель данных! Вы не должны хранить числа в виде строк. Вы должны правильно объявить отношения внешнего ключа. Строки не должны использоваться для хранения нескольких значений.

Иногда мы застреваем, принимая действительно очень, очень, очень плохие решения других людей. Вы можете делать все, что хотите, с помощью `например:

Select t1.*
from tbl_1 t1
where exists (select 1
              from tbl_2 t2
              where t2.id = 1 and
                    ',' || t2.value || ',' like '%,' || t1.id ',%'
             );

Однако ваши усилия должны быть направлены на исправление данных, а не на попытки справиться с ними. Правильными данными будет таблица соединений / ассоциаций с одной строкой на id и value для таблицы 2:

id  value
1   1
1   2
1   3
2   5
2 голосов
/ 26 мая 2020

Еще один вариант:

SQL> with
  2  -- sample data
  3  tbl_1 (id) as
  4    (select 1 from dual union all
  5     select 2 from dual union all
  6     select 3 from dual union all
  7     select 4 from dual union all
  8     select 5 from dual union all
  9     select 6 from dual union all
 10     select 7 from dual union all
 11     select 8 from dual union all
 12     select 9 from dual
 13    ),
 14  tbl_2 (id, value) as
 15    (select 1, '1,2,3' from dual union all
 16     select 2, '5,6,7' from dual
 17    )
 18  -- query which returns what you want
 19  select a.id
 20  from tbl_1 a join
 21    (select regexp_substr(b.value, '[^,]+', 1, column_value) id
 22     from tbl_2 b cross join
 23       table(cast(multiset(select level from dual
 24                           connect by level <= regexp_count(b.value, ',') + 1
 25                          ) as sys.odcinumberlist))
 26     where b.id = 1
 27    ) c on c.id = a.id;

        ID
----------
         1
         2
         3

SQL>
1 голос
/ 26 мая 2020

Один вариант использует строковые функции:

select t1.*
from t1
inner join t2 on ',' || t2.value || ',' like '%,' || t1.id || ',%'
where t2.id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...