如何修改SQL语句以输出仅含一个逗号和一个分号的行?
筛选仅含一个逗号和一个分号的行解决方案
一、修改原有LIKE语句(基础实现)
如果坚持用LIKE,需要额外排除包含多个逗号或分号的情况,调整后的SQL如下:
SELECT * FROM table WHERE history_coord IS NULL OR (history_coord LIKE '%,%' AND history_coord NOT LIKE '%,%,%' AND history_coord LIKE '%;%' AND history_coord NOT LIKE '%;%;%')
原理是用NOT LIKE过滤掉有两个及以上逗号/分号的行,不过这种写法对特殊位置的字符(比如逗号在开头/结尾)兼容性一般,仅适合简单场景。
二、用字符串函数替代LIKE(更精准可靠)
更推荐用字符串统计的方法,通过计算字符出现次数来筛选,大多数SQL数据库都支持这类函数:
SELECT * FROM table WHERE history_coord IS NULL OR (LENGTH(history_coord) - LENGTH(REPLACE(history_coord, ',', '')) = 1 AND LENGTH(history_coord) - LENGTH(REPLACE(history_coord, ';', '')) = 1)
逻辑说明:
REPLACE(history_coord, ',', '')会移除字符串里所有逗号,原字符串长度减去替换后的长度,差值就是逗号的出现次数,等于1就表示只有一个逗号。- 分号的统计逻辑和逗号完全相同。
- 如果你不需要保留
history_coord为NULL的行,直接删掉OR history_coord IS NULL这部分即可。
注意:不同数据库的长度函数可能有差异,比如SQL Server用LEN代替LENGTH,Oracle和MySQL用LENGTH,按需调整即可。
内容的提问来源于stack exchange,提问作者Olga Otinova
相关产品推荐
相关产品推荐

