ada*_*shr 4 mysql sql csv search procedure
我在MySQL中有一个表,ITEM,它存储数据如下:
ID FEATURES
--------------------
1 AB,CD,EF,XY
2 PQ,AC,A3,B3
3 AB,CDE
4 AB1,BC3
--------------------
Run Code Online (Sandbox Code Playgroud)
作为输入,我将得到一个CSV字符串,类似"AB,PQ".我想获得包含AB或PQ的记录.我意识到我们要编写一个MySQL函数来实现这一目标.所以,如果我们在MySQL中定义了这个神奇的函数MATCH_ANY来执行此操作,那么我只需按如下方式执行SQL:
select * from ITEM where MATCH_ANY(FEAURES, "AB,PQ") = 0
Run Code Online (Sandbox Code Playgroud)
上面的查询将返回记录1,2和3.
但是我在实现这个功能时遇到了各种各样的问题,因为我意识到MySQL不支持数组,并且没有简单的方法来基于分隔符拆分字符串.
改造表是我的最后一个选择,因为它涉及很多问题.
我可能还想执行包含多个MATCH_ANY函数的查询,例如:
select * from ITEM where MATCH_ANY(FEATURES, "AB,PQ") = 0 and MATCH_ANY(FEATURES, "CDE")
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我们将得到一个记录(1,2,3)和(3)的交集,这将只有3.
非常感谢任何帮助.
谢谢
首先,数据库当然不应包含逗号分隔值,但您希望已经知道这一点.如果表格已标准化,您可以使用以下查询轻松获取项目:
select distinct i.Itemid
from Item i
inner join ItemFeature f on f.ItemId = i.ItemId
where f.Feature in ('AB', 'PQ')
Run Code Online (Sandbox Code Playgroud)
您可以匹配逗号分隔值中的字符串,但效率不高:
select Id
from Item
where
instr(concat(',', Features, ','), ',AB,') <> 0 or
instr(concat(',', Features, ','), ',PQ,') <> 0
Run Code Online (Sandbox Code Playgroud)
对于所有 REGEXP 爱好者,我想我应该添加这个作为解决方案:
SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]';
Run Code Online (Sandbox Code Playgroud)
对于区分大小写:
SELECT * FROM ITEM WHERE FEATURES REGEXP BINARY '[[:<:]]AB|PQ[[:>:]]';
Run Code Online (Sandbox Code Playgroud)
对于第二个查询:
SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]' AND FEATURES REGEXP '[[:<:]]CDE[[:>:]];
Run Code Online (Sandbox Code Playgroud)
干杯!
归档时间: |
|
查看次数: |
3421 次 |
最近记录: |