SQLite3中如何在WHERE子句提取xxxx-xxxxx格式字符串?
SQLite3提取xxxx-xxxxx格式内容的方案
要从自由格式文本里提取第一个符合xxxx-xxxxx(4位数字+短横线+5位数字)的内容,可以用以下两种方法实现:
方法1:正则表达式提取(需SQLite 3.33.0+)
如果你的SQLite版本支持正则扩展,直接用正则匹配提取第一个符合项:
SELECT SUBSTR( your_column, INSTR(your_column, REGEXP_MATCH(your_column, '\d{4}-\d{5}')), 10 ) AS extracted_code FROM your_table WHERE your_column REGEXP '\d{4}-\d{5}';
方法2:纯内置函数实现(兼容所有SQLite版本)
如果环境不支持正则,用内置的字符串处理函数组合也能搞定:
SELECT SUBSTR( your_column, INSTR(your_column, SUBSTR(your_column, INSTR(your_column, '-') - 4, 5)), 10 ) AS extracted_code FROM your_table WHERE INSTR(your_column, '-') > 4 AND SUBSTR(your_column, INSTR(your_column, '-') - 4, 4) GLOB '[0-9][0-9][0-9][0-9]' AND SUBSTR(your_column, INSTR(your_column, '-') + 1, 5) GLOB '[0-9][0-9][0-9][0-9][0-9]';
测试效果
针对你给出的测试数据:
'Widget 1234-12345 Blah Blah',
'1234-12345_A',
'1234-12345 and 6789-12345'
'1234-1234567'
执行后所有记录都会返回第一个匹配的1234-12345,最后一条数据虽然后面多了两位数字,但因为只提取前10位,结果依然正确。
补充说明
GLOB是SQLite自带的模式匹配工具,[0-9]用来匹配单个数字,能精准验证格式。- 如果要批量清理数据,把
SELECT改成UPDATE,就能把提取出的正确内容更新到目标字段里。
内容的提问来源于stack exchange,提问作者Lee Murray
相关产品推荐
相关产品推荐

