SQL проверить, содержит ли поля одинаковые буквы - PullRequest
0 голосов
/ 11 марта 2020

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

Например, я иметь буквы "ab c":

bca -> true

acb -> true

abcd -> **false**

ab -> **false**

Спасибо!

1 Ответ

1 голос
/ 11 марта 2020

Вы можете использовать рекурсивные CTE s, чтобы разделить параметр 'abc' и значение каждого столбца на буквы и сравнить их:

with
  recursive paramletters as (
    select 'abc' col, 1 pos, substr('abc', 1, 1) letter
    union all
    select col, pos + 1, substr(col, pos + 1, 1)
    from paramletters
    where pos < length(col)      
  ),  
  param as (
    select group_concat(letter, '') over (order by letter) paramvalue
    from paramletters
    order by paramvalue desc limit 1
  ),  
  cteletters as (
    select col, 1 pos, substr(col, 1, 1) letter
    from tablename
    union all
    select col, pos + 1, substr(col, pos + 1, 1)
    from cteletters
    where pos < length(col)
   ),
  cte as (
    select * from ( 
      select col, group_concat(letter, '') over (partition by col order by letter) colvalue
      from cteletters
    )
    where length(colvalue) = length(col)
   )  
select c.col, c.colvalue = p.paramvalue result 
from cte c cross join param p

См. Демонстрационную версию . Результаты:

| col  | result |
| ---- | ------ |
| ab   | 0      |
| abcd | 0      |
| acb  | 1      |
| bca  | 1      |

Если буквы параметра уже отсортированы (например, 'abc'), то этот код можно упростить, чтобы использовать только последние 2 CTE с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...