如果其他行中包含ID为1的ID,是否可以在ID的一列中搜索1?

时间:2019-07-03 18:09:00

标签: mysql sql

我有一个带有varchar列的MySQL数据库(尽管可以根据需要更改列类型)。

该列中存储了一些用下划线分隔的ID,如下所示:

第1行:1

第2行:1_2_3

第3行:10_2

第4行:4_5_1

该结构中是否存在要查询该列的1并返回所有包含1的行(但不包含包含1但ID为10的第3行)的情况。

要获取当前结果,我正在尝试搜索列LIKE %1%

还是我需要更改结构以获得所需的结果?

3 个答案:

答案 0 :(得分:3)

也许您可以尝试:

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

您需要将下划线转为\_,因为SQL将其定义为通配符,并且可以匹配任何字符。

答案 1 :(得分:2)

如果有逗号分隔符,则可以使用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


注意:

存储下划线分隔的列表是一种反模式。参见Bill Karwin的书“ SQL Antipatterns:避免数据库编程的陷阱”的第2章

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

答案 2 :(得分:1)

与操作员like

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

请参见demo
结果:

| id    |
| ----- |
| 1     |
| 1_2_3 |
| 4_5_1 |