You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:15:21