Как проверить, существует ли строка в одном поле в каждом элементе поля через запятую - PullRequest
0 голосов
/ 01 мая 2019

У меня есть таблица, которая содержит два поля. Первый - name типа string. Вторая содержит одну или несколько строк, разделенных запятой (но может содержать одну строку без запятых)

Я хочу создать запрос, чтобы узнать, существует ли строка в поле name * в каждые разделенные запятыми строки в поле names.

Пример 1:

---------------------------------------------------------
name          names
---------------------------------------------------------
myname        xmyname,myname,mynamey

Все строки, разделенные запятыми, содержат слово myname. Таким образом, запрос не должен возвращать эту строку.

Но, Пример 2:

---------------------------------------------------------
name          names
---------------------------------------------------------
myname        x,myname,mynamey

Должен быть возвращен. Потому что x не содержит мое имя.

Условие состоит в том, что если строка в поле name не существует в каждой строк, разделенных запятыми, в поле names, то возвращается строка.

Это неверно, так как этот запрос не вернет true в примере 2 (который содержит x, который не содержит myname).

ВАЖНОЕ ПРИМЕЧАНИЕ:

1) Количество запятых не ограничено. Это может быть 0 запятых или больше. Как с этим бороться?

2) Строки являются переменными. Это не всегда тот случай, когда строка myname. Каждая строка содержит отдельную строку в поле name.

Ответы [ 4 ]

0 голосов
/ 01 мая 2019

Попробуйте это регулярное выражение:

where not concat(names, ',') regexp replace('^([^,]*{n}[^,]*,)*$', '{n}', name)

Демо-версия db-fiddle

Как читать шаблон:

Внутренний шаблон [^,]*{n}[^,]*, означает

  • Любой символ без запятой [^,] повторяется любое количество раз (* означает ни разу, ни несколько раз).
  • , за которым следует значение столбца name ({n} является заполнителем и будет заменен фактическим значением с использованием функции replace())
  • , за которым следует любой символ без запятой [^,], повторяемый любое число раз, за ​​которыми следует
  • через запятую

Внешний шаблон ^({inner_pattern})*$ означает

  • Начало строки (^)
  • , за которым следует внутренний шаблон, повторяемый любойколичество раз
  • с последующим концом строки ($)

Чтобы сделать эту работу, к столбцу names (concat(names, ',')) добавляется запятая, поэтомучто каждый элемент в строке заканчивается запятой.

Шаблон будет гарантировать, что любой элемент в строке через запятуюns значение столбца name.Поскольку вы хотите получить противоположный результат, мы используем where not ...

0 голосов
/ 01 мая 2019

Предполагая, что "мое имя" не появляется дважды между двумя запятыми, вы можете посчитать запятые и "мое имя" s:

where (length(names) - length(replace(names, ','))) >=
       length(names) - length(replace(names, 'myname', '12345'))
0 голосов
/ 01 мая 2019

Вы можете подойти к этому, используя следующий SQL запрос

SELECT 
name, names
FROM 
`tablename` 
WHERE 
(LENGTH(names) - LENGTH(REPLACE(names, ',', '')) + 1) 
=  
ROUND (   
  (
        LENGTH(names)
        - LENGTH( REPLACE ( names, name, "") ) 
  )/ LENGTH(name)       
);

Объяснение: -

Это даст вам количество слов, разделенных ,

(LENGTH(names) - LENGTH(REPLACE(names, ',', '')) + 1) - 

Ниже приведено совпадение name в каждой строке и возвращено, сколько раз оно найдено

 ROUND (   
    (
        LENGTH(names)
        - LENGTH( REPLACE ( names, name, "") ) 
    ) / LENGTH(name)        
)

DEMO

0 голосов
/ 01 мая 2019

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

name     | names
myname   | xmyname
myname   | myname
myname   | mynamey
somename | x
somename | myname
somename | mynamey

Теперь мы можем выполнить простой запрос агрегирования, чтобыответьте на свой вопрос:

SELECT name
FROM yourTable
GROUP BY name
HAVING COUNT(CASE WHEN names NOT LIKE CONCAT('%', name, '%') THEN 1 END) > 0;

Демо

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