我在表格中有一个字段,我查询的内容与此相似:
Name Phone Category_IDS Category_Labels
Sample 1111111111 ["1"] ["foo", "bar"]
我正在尝试使用FIND_IN_SET函数来查找包含逗号分隔列表中列出的值之一的所有行。像这样的东西什么都不返回:
SELECT * FROM sampletable WHERE FIND_IN_SET('1', category_ids) <> 0
如果我这样做,它确实有效:
SELECT * FROM factual_usplaces WHERE FIND_IN_SET('["1"]', category_ids) <> 0
但当然,这限制了搜索到category_ids或labels只包含逗号分隔列表中的单个值的行。所以会找到[“1”]但是[“1”,“2”]不会。
有没有办法在查询中动态删除字符串中的括号和引号?
答案 0 :(得分:7)
如果数据的存储方式与您的显示方式完全相同,那么您可以在将category_ids
投放到FIND_IN_SET()
之前使用REPLACE()
删除双引号和括号。
SELECT *
FROM Table1
WHERE FIND_IN_SET(1, REPLACE(
REPLACE(
REPLACE(category_ids, '"', ''),
'[', ''),
']','')) > 0
这是 SQLFiddle
现在,如果您将大量使用它,那么您可以考虑创建一个用户定义的函数来简化您的代码
CREATE FUNCTION UNQOUTE_LIST(_list VARCHAR(512))
RETURNS VARCHAR(512)
RETURN
REPLACE(
REPLACE(
REPLACE(_list, '"', ''),
'[', ''),
']','');
并使用它
SELECT *
FROM Table1
WHERE FIND_IN_SET(1, UNQOUTE_LIST(category_ids)) > 0
这是 SQLFiddle
答案 1 :(得分:0)
使用like运算符
尝试下面的sql查询SELECT * FROM factual_usplaces WHERE category_ids LIKE'%1,2%'
希望这可以帮到你