我有一个带有varchar列的MySQL数据库(尽管可以根据需要更改列类型)。
该列中存储了一些用下划线分隔的ID,如下所示:
第1行:1
第2行:1_2_3
第3行:10_2
第4行:4_5_1
该结构中是否存在要查询该列的1并返回所有包含1的行(但不包含包含1但ID为10的第3行)的情况。
要获取当前结果,我正在尝试搜索列LIKE %1%
。
还是我需要更改结构以获得所需的结果?
答案 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)