Выберите записи на основе известного значения переменной - PullRequest
0 голосов
/ 09 июля 2020

Мне нужно выбрать серию записей на основе известного значения. Идентификаторы записей следуют иерархической структуре, где первые 4 символа являются константами (IA09), за ними следуют 4 цифры, представляющие организацию, за которыми следуют 4 символа, представляющие сущность в родительской организации. Цель состоит в том, чтобы выбрать все «дочерние» записи известного значения, а также запись «известного значения».

Пример набора данных:

IA0900000000
IA0912340000
IA0912340109
IA0912340418
IA0912340801
IA0945810000
IA0945810215
IA0945810427
IA0945810454

Вот тот же набор данных, с отступом для иллюстрации иерархической структуры.

IA0900000000
  IA0912340000
    IA0912340109
    IA0912340418
    IA0912340801
  IA0945810000
    IA0945810215
    IA0945810427
    IA0945810454

Пример 1
Если известное значение - «IA0900000000», мне нужно выбрать все записи в наборе данных.

Пример 2
Если известное значение - «IA0945810000», мне нужно выбрать все записи, начинающиеся с «IA094581»

Пример 3
Если известное значение - «IA0912340109», мне нужно выбрать ТОЛЬКО запись с этот идентификатор, поскольку он не имеет дочерних записей.

Фактический набор данных намного больше, чем этот образец, и известное значение будет отличаться для каждого пользователя базы данных.

Есть ли простое сравнение Я мог бы использовать предложение WHERE, которое даст мне правильное подмножество записей?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Предположим, ваша таблица называется YourTable, а имя столбца - column. Вы можете удалить завершающий 0 из поискового запроса и объединить его с помощью подстановочного знака (%) и использовать оператор LIKE следующим образом:

SELECT * 
FROM YourTable 
WHERE column LIKE TRIM(TRAILING '0' FROM  'IA0945810000') || '%' 
0 голосов
/ 09 июля 2020

В вашем случае можно использовать простое «лайк»:

with t(org) as (-- test_data:
select 'IA0900000000' from dual union all
select 'IA0912340000' from dual union all
select 'IA0912340109' from dual union all
select 'IA0912340418' from dual union all
select 'IA0912340801' from dual union all
select 'IA0945810000' from dual union all
select 'IA0945810215' from dual union all
select 'IA0945810427' from dual union all
select 'IA0945810454' from dual 
)
select 
  regexp_replace(
     regexp_replace(
        regexp_replace(t.org,'0{4}')
       ,'0{4}')
    ,'(.{4})'
    ,'\1.'
  ) as short_org_path -- just for better readability
 ,t.* 
from t
where t.org like regexp_replace(regexp_replace('&input_org','0{4}'),'0{4}')||'%'
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...