基于数组的SQL查询实现及多类型值自动匹配查询问题
问题解答
一、SQL的数组支持与多值查询修正
不同数据库对数组的支持存在差异,你之前的写法问题在于把行值构造器当成了数组使用,导致只匹配第一个元素:
- MySQL:没有原生数组类型,你可以用
IN子句直接实现多值查询,或者用字符串拆分的方式处理变量:-- 直接指定多值的写法 SELECT * FROM cinfo WHERE email IN ('test@email.com', 'test2@email.com'); -- 用变量传递多值(注意值里不能包含逗号) SET @test = 'test@email.com,test2@email.com'; SELECT * FROM cinfo WHERE FIND_IN_SET(email, @test); - PostgreSQL:支持原生数组类型,可通过
= ANY()匹配数组元素:SET @test = ARRAY['test@email.com', 'test2@email.com']; SELECT * FROM cinfo WHERE email = ANY(@test);
二、根据值的类型自动匹配查询
可以通过UNION ALL合并查询逻辑,结合条件判断自动匹配值的类型:
-- 替换括号里的内容为你的待查询值列表 SELECT * FROM cinfo WHERE email IN ('test@email.com', 'exampleuser1234', 'examplevin1234') AND email LIKE '%@%' UNION ALL SELECT * FROM customer WHERE UUID IN ('test@email.com', 'exampleuser1234', 'examplevin1234') -- 根据实际UUID格式调整正则,这里以32位十六进制为例 AND UUID REGEXP '^[a-fA-F0-9]{32}$' UNION ALL SELECT * FROM cinfo WHERE vin IN ('test@email.com', 'exampleuser1234', 'examplevin1234') AND vin NOT LIKE '%@%' AND vin NOT REGEXP '^[a-fA-F0-9]{32}$';
如果用变量传递值列表,MySQL可搭配字符串拆分逻辑,PostgreSQL直接用数组= ANY()替换IN即可。
内容的提问来源于stack exchange,提问作者Nelson
相关产品推荐
相关产品推荐

