在MySQL表中搜索包含CSV数据的列,以查找是否存在输入值

时间:2010-05-18 12:04:07

标签: sql mysql search csv procedure

我在MySQL中有一个表,ITEM,它存储数据如下:

ID    FEATURES
--------------------
1     AB,CD,EF,XY
2     PQ,AC,A3,B3
3     AB,CDE
4     AB1,BC3
--------------------

作为输入,我将获得一个CSV字符串,类似“AB,PQ”。我想获得包含AB或PQ的记录。我意识到我们要编写一个MySQL函数来实现这一目标。所以,如果我们在MySQL中定义了这个神奇函数MATCH_ANY来执行此操作,那么我将按如下方式执行SQL:

select * from ITEM where MATCH_ANY(FEAURES, "AB,PQ") = 0

上述查询将返回记录1,2和3。

但是我在实现这个函数时遇到了各种各样的问题,因为我意识到MySQL不支持数组,并且没有简单的方法来根据分隔符拆分字符串。

重新制作表格对我来说是最后一个选项,因为它涉及很多问题。

我可能还想执行包含多个MATCH_ANY函数的查询,例如:

select * from ITEM where MATCH_ANY(FEATURES, "AB,PQ") = 0 and MATCH_ANY(FEATURES, "CDE")

在上面的例子中,我们会得到一个记录(1,2,3)和(3)的交集,它们只有3个。

非常感谢任何帮助。

由于

5 个答案:

答案 0 :(得分:7)

首先,数据库当然不应包含逗号分隔值,但您希望已经知道这一点。如果表格已标准化,您可以使用以下查询轻松获取项目:

select distinct i.Itemid
from Item i
inner join ItemFeature f on f.ItemId = i.ItemId
where f.Feature in ('AB', 'PQ')

您可以匹配逗号分隔值中的字符串,但效率不高:

select Id
from Item
where
  instr(concat(',', Features, ','), ',AB,') <> 0 or
  instr(concat(',', Features, ','), ',PQ,') <> 0

答案 1 :(得分:3)

select * 
  from ITEM where 
 where CONCAT(',',FEAURES,',') LIKE '%,AB,%'
    or CONCAT(',',FEAURES,',') LIKE '%,PQ,%'

或创建自定义函数来执行MATCH_ANY

答案 2 :(得分:3)

对于所有REGEXP爱好者,我想我会将其作为解决方案添加:

SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]';

并且区分大小写:

SELECT * FROM ITEM WHERE FEATURES REGEXP BINARY '[[:<:]]AB|PQ[[:>:]]';

对于第二个查询:

SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]' AND FEATURES REGEXP '[[:<:]]CDE[[:>:]];

干杯!

答案 3 :(得分:1)

或者,考虑使用RLIKE()

    select * 
      from ITEM
     where ','+FEATURES+',' RLIKE ',AB,|,PQ,'; 

答案 4 :(得分:0)

只是一个想法:

是否必须在SQL中完成?这是您通常希望用PHP或Python编写的东西,或者您用于与数据库交互的任何语言。

这种方法意味着您可以使用所需的任何复杂逻辑构建查询字符串,然后只提交一个vanilla SQL查询,而不是尝试在SQL中构建过程。