如何基于含表字段的搜索参数筛选行?字段匹配搜索串查询方法
这两个都是写SQL时高频遇到的匹配需求,我来分别拆解解决方案:
我先默认你要的是用一个关键词搜索,找出表中指定字段里包含这个关键词的所有行(比如搜"MIN",要揪出Permission字段带"MIN"的MODERATOR行)。不同SQL方言的实现大同小异,核心用字符串包含判断:
MySQL/MariaDB:用
LIKE加通配符%就行,%能匹配任意长度的任意字符SELECT * FROM your_table WHERE permission LIKE '%你的搜索关键词%';比如搜"MIN"就写成
LIKE '%MIN%',所有Permission里带"MIN"的行都会被捞出来。PostgreSQL:除了
LIKE,还能用POSITION函数——如果关键词在字段里,返回的位置会大于0-- 用LIKE的写法和上面一样 SELECT * FROM your_table WHERE permission LIKE '%你的搜索关键词%'; -- 用POSITION的写法 SELECT * FROM your_table WHERE POSITION('你的搜索关键词' IN permission) > 0;SQL Server:可以用
LIKE,或者CHARINDEX函数,逻辑和POSITION类似-- LIKE写法 SELECT * FROM your_table WHERE permission LIKE '%你的搜索关键词%'; -- CHARINDEX写法 SELECT * FROM your_table WHERE CHARINDEX('你的搜索关键词', permission) > 0;
如果你的需求是反过来——搜索参数是个包含多个值的字符串,要找字段值在这个字符串里的行,那和问题2的场景差不多,直接看下面的方案就行。
看你给的示例,搜索串是USER+COMMENT+MODERATOR,要匹配Permission为USERS和MODERATOR的行——这里应该是字段值包含搜索串拆分后的关键词(比如USERS包含USER),或者完全匹配?我分两种情况给你方案:
场景1:字段值包含搜索串中的任意关键词(比如USERS匹配USER)
这种情况用正则表达式最方便,把搜索串里的+换成正则的或运算符|就行:
以MySQL为例:
SELECT * FROM your_table WHERE permission REGEXP REPLACE('USER+COMMENT+MODERATOR', '+', '|');
这条SQL会把搜索串转换成USER|COMMENT|MODERATOR,只要Permission字段里包含这三个关键词中的任意一个,就会被匹配到——刚好符合你示例里要的USERS和MODERATOR都被选中的需求。
场景2:字段值和搜索串中的关键词精确匹配(只匹配USER、COMMENT、MODERATOR)
如果要严格精确匹配,就得先把搜索串拆成单个关键词,再用JOIN或者IN子句来匹配:
MySQL 8.0+:用
STRING_SPLIT拆分字符串SELECT t.* FROM your_table t JOIN STRING_SPLIT('USER+COMMENT+MODERATOR', '+') s ON t.permission = s.value;PostgreSQL:用
STRING_TO_ARRAY加UNNEST来拆分SELECT t.* FROM your_table t JOIN UNNEST(STRING_TO_ARRAY('USER+COMMENT+MODERATOR', '+')) s(value) ON t.permission = s.value;SQL Server:同样用
STRING_SPLITSELECT t.* FROM your_table t JOIN STRING_SPLIT('USER+COMMENT+MODERATOR', '+') s ON t.permission = s.value;
要是你的搜索串分隔符不是+,只要把REPLACE或者STRING_SPLIT里的分隔符改成对应的就行。
内容的提问来源于stack exchange,提问作者Carl Flood

