【问题标题】:MySQL FIND_IN_SET With Array StringMySQL FIND_IN_SET 带数组字符串
【发布时间】:2013-09-10 04:50:00
【问题描述】:

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

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"]。

有没有办法在查询中即时从字符串中删除括号和引号?

【问题讨论】:

  • 表中的数据很奇怪。为什么它们被包裹在[...]中?我建议您阅读有关数据库规范化的文章。
  • 该表实际上不是由我创建的,它是一家名为 Factual 的公司,非常广为人知和使用。奇怪的是他们也用括号括住了我......

标签: mysql sql


【解决方案1】:

如果数据完全按照您的显示方式存储,那么您可以在将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

【讨论】:

  • 替换是这里的关键。所以你不能用我假设的一个替换函数替换多个字符?
  • 不,很遗憾你不能。
【解决方案2】:

用like运算符尝试下面的sql查询

SELECT * FROM factual_usplaces WHERE category_ids LIKE '%1,2%'

希望对你有帮助

【讨论】:

  • 点赞不行。我需要使用 FIND_IN_SET 函数,否则会导致很多其他问题。
  • SELECT * FROM factual_usplaces WHERE (FIND_IN_SET('1', category_ids)) OR (FIND_IN_SET('2', category_ids))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 2012-08-19
相关资源
最近更新 更多