如何通过SELECT LIKE语句匹配文本字段中的整行目标字符串?
解决多行文本字段中匹配整行内容的SQL问题
你的问题核心是要在存储多行文本的keywords字段里,精准匹配那些包含**整行恰好是"easter rising"**的记录,而不是只要字段里出现这个短语就匹配。原来的LIKE '%easter rising%'会把包含该短语的所有记录都拉出来,所以才会不符合预期。
下面分不同数据库给出针对性的解决方案:
支持正则表达式的数据库(MySQL、PostgreSQL、SQLite)
正则表达式可以方便地匹配行边界(字段开头/结尾或者换行符),确保我们只匹配整行的目标字符串:
MySQL/MariaDB
SELECT ID FROM titles WHERE keywords REGEXP '(^|\n)easter rising(\n|$)'
(^|\n):匹配字段的起始位置,或者一个换行符(表示新行开始)easter rising:我们要精准匹配的目标内容(\n|$):匹配换行符(表示该行结束,后面还有其他行),或者字段的结束位置(表示这是最后一行)
PostgreSQL
考虑到Windows风格的换行符是\r\n,可以兼容处理:
SELECT ID FROM titles WHERE keywords ~ '(^|\r?\n)easter rising(\r?\n|$)'
如果需要不区分大小写匹配,把~换成~*即可。
SQLite
确保你的SQLite环境启用了正则表达式扩展,然后使用:
SELECT ID FROM titles WHERE keywords REGEXP '(^|\n)easter rising(\n|$)'
SQL Server
SQL Server对换行符的处理需要明确指定换行符字符(CHAR(10)是Unix换行,CHAR(13)+CHAR(10)是Windows换行),我们可以用LIKE组合多个条件来覆盖所有情况:
SELECT ID FROM titles WHERE keywords LIKE '%' + CHAR(10) + 'easter rising' + CHAR(10) + '%' OR keywords LIKE 'easter rising' + CHAR(10) + '%' OR keywords LIKE '%' + CHAR(10) + 'easter rising' OR keywords = 'easter rising'
- 第一条:匹配目标字符串在字段中间(前后都有换行)
- 第二条:匹配目标字符串是第一行,后面还有其他内容
- 第三条:匹配目标字符串是最后一行,前面有其他内容
- 第四条:匹配整个字段就是目标字符串
验证你的示例数据
用上面的语句测试你的示例:
- ID1:假设
keywords是两行文本(ireland history和easter rising),会匹配第三条条件,被选中 - ID2:
keywords是单行britain easter rising campaign,不满足任何条件,被排除 - ID3:
keywords是单行france easter rising,不满足任何条件,被排除 - ID4:
keywords就是easter rising,匹配第四条条件,被选中
完全符合你期望的结果。
如果需要区分大小写,只需要在对应语句里加上大小写敏感的处理即可(比如MySQL用REGEXP BINARY,PostgreSQL去掉~*改用~)。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

