Можно ли искать в столбце идентификаторов 1, если другие строки содержат идентификаторы с 1 в них? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть база данных MySQL со столбцом varchar (хотя тип столбца можно изменить при необходимости).

В столбце хранятся некоторые идентификаторы, разделенные подчеркиванием, например:

Строка 1: 1

Строка 2: 1_2_3

Строка 3: 10_2

Строка 4: 4_5_1

Есть ли в этой структуре возможность запрашивать в этом столбце 1 и возвращать все строки с 1 (кроме строки 3, содержащей 1, но идентификатор равен 10).

Чтобы получить текущие результаты, я пытаюсь найти столбец LIKE %1%.

Или мне нужно изменить структуру для достижения желаемого результата?

Ответы [ 3 ]

3 голосов
/ 03 июля 2019

Может быть, вы можете попробовать:

select *
from t
where c like '1\_%'
   or c like '%\_1'
   or c like '%\_1\_%'
   or c = '1'

Вам нужно экранировать подчеркивание как \_, поскольку SQL определяет его как подстановочный знак и будет соответствовать любому символу.

2 голосов
/ 03 июля 2019

Если бы у нас был разделитель запятых, то мы могли бы использовать функцию MySQL FIND_IN_SET.

Мы можем использовать функцию MySQL REPLACE, чтобы изменить подчеркивания на запятые,

например.

SELECT t.*
  FROM t 
 WHERE FIND_IN_SET('1',REPLACE( t.id ,'_',','))

Справка:

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_find-in-set

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_replace


Примечание:

Хранение разделенных подчеркиванием списков является антипаттерном. См. Главу 2 книги Билла Карвина «Антипаттерны SQL: предотвращение ловушек программирования баз данных»

https://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557

1 голос
/ 03 июля 2019

С оператором like:

select * from tablename
where concat('_', id, '_') like '%@_1@_%' escape '@' 

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

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