Мне нужен запрос для детей, который начинается с моего имени, но не начинается с любого в этом наборе - PullRequest
1 голос
/ 07 ноября 2019

Предположим, у меня есть таблица с текстовым первичным ключом, которая называется "имя". Учитывая имя (которое может содержать любые произвольные символы, включая%), мне нужно, чтобы все строки из этой таблицы, начинающиеся с этого имени, были длиннее этого имени и не начинались с чего-либо еще в таблице, которая длиннеечем данное имя.

Например, предположим, что моя таблица содержит имена ad, add, adder и adage. Если я запрашиваю «детей рекламы», я хочу получить обратно add, adage. (adder - это ребенок add). Можно ли сделать это эффективно, так как у меня несколько миллионов строк? Рекурсивные запросы, безусловно, доступны.

В настоящее время у меня другой подход, когда я поддерживаю «родительский» столбец. Код для поддержки этого столбца довольно болезненный, и было бы ненужным, если бы этот другой подход был разумным.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Я не могу сказать о его эффективности, но думаю, что он работает:

with cte as (
  select name 
  from tablename  
  where name like 'ad' || '_%'
)
select c.name
from cte c  
where not exists (
  select 1 from cte
  where c.name like name || '_%'
);

См. Демоверсию . Эквивалент вышеупомянутого запроса с самооценкой. ЛЕВЫЙ РЕЙТИНГ:

with cte as (
  select name 
  from tablename  
  where name like 'ad' || '_%'
)
select c.name
from cte c left join cte cc
on c.name like cc.name || '_%'
where cc.name is null

См. demo . Результаты:

| name  |
| ----- |
| add   |
| adage |
0 голосов
/ 07 ноября 2019

Вы можете использовать слева в столбце, как это:

 select *
 from sometable
 where lower(left(name,2)) = 'ad' and length(name) > 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...