admin

MySQL FIND_IN_SET带数组字符串

sql

我正在查询的表中有一个类似于以下内容的字段:

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或标签仅包含单个值的行。因此将找到[“ 1”],但不会找到[“ 1”,“ 2”]。

有没有一种方法可以在查询中即时删除字符串中的括号和引号?


阅读 180

收藏
2021-06-07

共1个答案

admin

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

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

2021-06-07