带有数组字符串的MySQL FIND_IN_SET

rya*_*dlf 2 mysql sql

我在表中有一个字段,我查询它看起来像这样:

Name          Phone          Category_IDS          Category_Labels
Sample        1111111111     ["1"]                 ["foo", "bar"]
Run Code Online (Sandbox Code Playgroud)

我试图使用FIND_IN_SET函数来查找包含逗号分隔列表中列出的值之一的所有行.像这样的东西什么都不返回:

SELECT * FROM sampletable WHERE FIND_IN_SET('1', category_ids) <> 0
Run Code Online (Sandbox Code Playgroud)

如果我这样做,它确实有效:

SELECT * FROM factual_usplaces WHERE FIND_IN_SET('["1"]', category_ids) <> 0
Run Code Online (Sandbox Code Playgroud)

但是,当然这限制了搜索到category_ids或labels只包含逗号分隔列表中的单个值的行.所以会找到["1"]但是["1","2"]不会.

有没有办法在查询中动态删除字符串中的括号和引号?

pet*_*erm 7

如果数据存储你究竟是如何表现它,那么你可以使用REPLACE()喂奶前剥离双引号和括号category_ids来FIND_IN_SET().

SELECT * 
  FROM Table1 
 WHERE FIND_IN_SET(1, REPLACE(
                        REPLACE(
                          REPLACE(category_ids, '"', ''), 
                        '[', ''), 
                      ']','')) > 0
Run Code Online (Sandbox Code Playgroud)

这是SQLFiddle


现在,如果你将使用它很多,那么你可以考虑创建一个用户定义的函数来简化你的代码

CREATE FUNCTION UNQOUTE_LIST(_list VARCHAR(512)) 
RETURNS VARCHAR(512)
RETURN 
REPLACE(
  REPLACE(
    REPLACE(_list, '"', ''), 
  '[', ''), 
']','');
Run Code Online (Sandbox Code Playgroud)

并使用它

SELECT * 
  FROM Table1 
 WHERE FIND_IN_SET(1, UNQOUTE_LIST(category_ids)) > 0
Run Code Online (Sandbox Code Playgroud)

这是SQLFiddle