SQL如何从非标准格式表字段中提取值完成条件筛选查询
解决方案
你当前存储自定义字段的列是把多组键值对拼接成了纯字符串存储,没有做结构化映射,所以无法直接写cf_engineering_required = false这类条件筛选,需要按照字符串的固定格式规则匹配取值,以下是可直接落地的写法:
快速实现(适合初学者,全数据库通用)
利用字符串模糊匹配,带上固定格式边界避免误匹配,直接筛选目标记录即可:
SELECT * FROM 你的表名 WHERE 存这组内容的字段名 LIKE '%name=cf_engineering_required%value=false}%'
- 注意:从你给出的存储示例看,每个
name值都是全局唯一的,这个写法不会出现匹配错误,不需要写复杂函数,能最快满足你的筛选需求。如果要筛选其他字段,只需要替换语句里的字段名和目标值就行,比如要查cf_initial_email_sent = false,就把条件里的键值换成对应内容即可。
精准提取值(适合需要把字段值单独查出来复用的场景)
如果需要把目标字段的值单独作为一列返回,可以用对应数据库的字符串函数截取,以下是常用数据库的写法示例:
MySQL 写法
SELECT *, TRIM( REPLACE( SUBSTRING_INDEX( SUBSTRING_INDEX(存这组内容的字段名, 'name=cf_engineering_required', -1), '}', 1 ), '''value=', '' ) ) AS cf_engineering_required FROM 你的表名 -- 筛选时直接加条件即可 WHERE TRIM( REPLACE( SUBSTRING_INDEX( SUBSTRING_INDEX(存这组内容的字段名, 'name=cf_engineering_required', -1), '}', 1 ), '''value=', '' ) ) = 'false'
PostgreSQL 写法
用正则匹配提取更简洁:
SELECT *, SUBSTRING(存这组内容的字段名 FROM 'name=cf_engineering_required.*?value=([^}]+)') AS cf_engineering_required FROM 你的表名 WHERE SUBSTRING(存这组内容的字段名 FROM 'name=cf_engineering_required.*?value=([^}]+)') = 'false'
长期优化建议
这类纯字符串存键值对的方式查询性能很差,如果后续需要频繁查询这类自定义字段:
- 优先在数据写入环节就把高频查询的自定义字段拆成独立的结构化列存储
- 其次可以把该列改成数据库原生的JSON类型存储,用配套的JSON函数查询,效率和准确性都比纯字符串匹配高很多
内容的提问来源于stack exchange,提问作者bobbytici
相关产品推荐
相关产品推荐

