MySQL FIND_IN_SET 与数组字符串

2024-01-09

我正在查询的表中有一个字段与此类似:

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

但当然,这限制了搜索类别 ID 或标签仅包含逗号分隔列表中的单个值的行。因此会找到 ["1"],但不会找到 ["1", "2"]。

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


如果数据完全按照您显示的方式存储,那么您可以使用REPLACE() http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace在馈送之前去除双引号和括号category_ids to FIND_IN_SET().

SELECT * 
  FROM Table1 
 WHERE FIND_IN_SET(1, REPLACE(
                        REPLACE(
                          REPLACE(category_ids, '"', ''), 
                        '[', ''), 
                      ']','')) > 0

Here is SQLFiddle http://sqlfiddle.com/#!2/b269a/1


现在,如果您会经常使用它,那么您可以考虑创建一个用户定义的函数来简化您的代码

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

Here is SQLFiddle http://sqlfiddle.com/#!2/f1c39/1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL FIND_IN_SET 与数组字符串 的相关文章