SQL及JavaScript UDF实现Contains与NotContains匹配方法咨询
SQL字符串包含判断实现方案
SQL原生完全支持你说的包含/不包含校验需求,无需额外扩展即可实现,具体实现方法如下:
1、校验固定字符串“ABC”是否包含在Column1字段中
通用实现(所有数据库兼容)
使用LIKE模糊匹配语法即可:
- 包含判断:
SELECT * FROM 你的表名 WHERE Column1 LIKE '%ABC%';
其中%是通配符,代表匹配任意长度的任意字符
- 不包含判断:
SELECT * FROM 你的表名 WHERE Column1 NOT LIKE '%ABC%';
不同数据库专属更高效的实现
- MySQL/OceanBase/Oracle:用
INSTR函数,性能优于LIKE(无通配符解析开销)-- 包含 SELECT * FROM 你的表名 WHERE INSTR(Column1, 'ABC') > 0; -- 不包含 SELECT * FROM 你的表名 WHERE INSTR(Column1, 'ABC') = 0; - SQL Server:用
CHARINDEX函数,若要使用自带的CONTAINS全文检索函数,需要提前给Column1创建全文索引-- 普通包含判断 SELECT * FROM 你的表名 WHERE CHARINDEX('ABC', Column1) > 0; -- 全文检索场景的CONTAINS用法(需要全文索引) SELECT * FROM 你的表名 WHERE CONTAINS(Column1, 'ABC'); SELECT * FROM 你的表名 WHERE NOT CONTAINS(Column1, 'ABC'); - PostgreSQL:用
POSITION函数SELECT * FROM 你的表名 WHERE POSITION('ABC' IN Column1) > 0;
2、校验Column1的取值是否包含在Column2字段中
逻辑和固定字符串判断一致,只需把固定搜索值替换为字段名即可,注意通配符要和字段值拼接:
通用实现
-- 包含:Column1的值在Column2中存在 SELECT * FROM 你的表名 WHERE Column2 LIKE CONCAT('%', Column1, '%'); -- 不包含:Column1的值在Column2中不存在 SELECT * FROM 你的表名 WHERE Column2 NOT LIKE CONCAT('%', Column1, '%');
不同数据库专属实现
- MySQL/Oracle:
SELECT * FROM 你的表名 WHERE INSTR(Column2, Column1) > 0; - SQL Server:
SELECT * FROM 你的表名 WHERE CHARINDEX(Column1, Column2) > 0;
如果你要判断的场景存在特殊字符(比如%、_这类LIKE的原生通配符),优先用INSTR/CHARINDEX这类函数,不会出现转义问题,判断逻辑更准确。
自定义扩展方案
如果原生函数满足不了复杂的判断需求(比如多关键词规则匹配、大小写特殊规则校验等),主流数据库都支持自定义函数实现:
- Snowflake、BigQuery、安装了plv8扩展的PostgreSQL都支持JavaScript UDF,示例如下:
-- 自定义包含判断JS UDF CREATE OR REPLACE FUNCTION CUSTOM_CONTAINS(target_str STRING, search_str STRING) RETURNS BOOLEAN LANGUAGE JAVASCRIPT AS ' return TARGET_STR.includes(SEARCH_STR); '; -- 调用示例 SELECT * FROM 你的表名 WHERE CUSTOM_CONTAINS(Column2, Column1) = TRUE;
- 其他数据库也支持对应语言的UDF,比如Oracle支持Java UDF、SQL Server支持.NET UDF、MySQL支持C/C++ UDF,均可按需实现自定义包含规则。
内容的提问来源于stack exchange,提问作者ADom
相关产品推荐
相关产品推荐

