技术问询:SQL如何在单查询中提取列中'is'和'isn't'后的子串且无空值
提取多个关键词后的子串(单列无空值)
Got it! 要解决这个问题,关键是优先匹配更长的关键词(避免短关键词误匹配长关键词里的子串),再用合并函数把两个截取结果整合成一列,最后过滤掉不含目标关键词的行就行。下面是主流SQL方言的具体实现:
MySQL/MariaDB 版本
SELECT COALESCE( -- 先处理'isn't',因为它比'is'长,防止把'isn't'里的'is'当成独立关键词 SUBSTRING(target_column, LOCATE('isn\'t', target_column) + 5), SUBSTRING(target_column, LOCATE('is', target_column) + 2) ) AS extracted_substring FROM your_table -- 过滤掉不包含任何目标关键词的行,避免空值 WHERE LOCATE('is', target_column) > 0 OR LOCATE('isn\'t', target_column) > 0;
PostgreSQL 版本
SELECT COALESCE( SUBSTRING(target_column FROM STRPOS(target_column, 'isn\'t') + 5), SUBSTRING(target_column FROM STRPOS(target_column, 'is') + 2) ) AS extracted_substring FROM your_table WHERE STRPOS(target_column, 'is') > 0 OR STRPOS(target_column, 'isn\'t') > 0;
SQL Server 版本
注意SQL Server里单引号要转义成两个单引号:
SELECT COALESCE( SUBSTRING(target_column, CHARINDEX('isn''t', target_column) + 5, LEN(target_column)), SUBSTRING(target_column, CHARINDEX('is', target_column) + 2, LEN(target_column)) ) AS extracted_substring FROM your_table WHERE CHARINDEX('is', target_column) > 0 OR CHARINDEX('isn''t', target_column) > 0;
关键逻辑说明
- 优先匹配长关键词:
isn't包含is,如果先处理短的is,会误截取isn't里的is部分,导致结果错误,所以必须先判断isn't。 - 合并结果去空值:
COALESCE会返回第一个非空的截取结果,这样不管行里是is还是isn't,都会得到对应的子串,不会出现多列或空值。 - 过滤无关行:
WHERE条件直接排除完全不含这两个关键词的行,确保最终结果里没有空值。
举个实际例子,假设你的数据是:
"This is a test"
"That isn't correct"
"No keyword here"
执行查询后会得到:
" a test"
" correct"
(第三行因不含关键词被过滤,不会出现在结果中)
内容的提问来源于stack exchange,提问作者cloudiebro
相关产品推荐
相关产品推荐

