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

SQL实现:通过处理两个字符串列生成新字符串列的需求及问题求助

解决从NameVer字段中移除末尾"-Ver"部分的问题

我来帮你搞定这个需求!你的目标是从NameVer字段里精准移除末尾的-<对应Ver值>部分(包括那个横杠),同时保留字段中间的横杠,还要处理可能存在的不可见空白字符对吧?先看看你之前代码出错的原因,再给你正确的解决方案。

为什么你的原代码得不到预期结果?

你之前写的SELECT SUBSTRING(NameVer, 1, LEN(Ver)+1) from myTable逻辑完全不对:LEN(Ver)是版本号的字符长度,加1后是固定截取前N个字符,比如第一行的Ver是10021(长度5),加1就是6,所以只截取了前6个字符Dr. Cr,这显然不是你要的结果。我们需要的是定位到末尾的-<Ver>位置,再截取前面的内容,而不是固定长度。

正确的SQL解决方案

下面的语句可以精准实现你的需求,同时处理空白字符:

SELECT 
    NameVer,
    Ver,
    TRIM(SUBSTRING(NameVer, 1, CHARINDEX('-' + Ver, NameVer) - 1)) AS Name
FROM myTable

代码解释:

  1. '-' + Ver:构造我们要精准匹配的后缀(横杠+版本号),这样就能定位到NameVer末尾的目标部分,不会误匹配中间的横杠。
  2. CHARINDEX('-' + Ver, NameVer):找到这个后缀在NameVer中的起始位置。
  3. SUBSTRING(NameVer, 1, 位置-1):从NameVer开头截取到后缀起始位置的前一个字符,这样就去掉了-<Ver>部分。
  4. TRIM():自动去除结果前后的不可见空白字符(比如空格、制表符),确保输出干净。

测试你的示例数据

用你提供的测试数据运行上面的语句,会得到完全符合预期的结果:

NameVerVerName
Dr. Cristine Pharrel HF-1002110021Dr. Cristine Pharrel HF
Mary-2Jane Jean-CF2331CF2331Mary-2Jane Jean
Michael 1772 d'Oro-10277631027763Michael 1772 d'Oro

额外的边界处理(可选)

如果担心某些行的NameVer里没有匹配的-<Ver>后缀,可以加个CASE语句做兼容,避免报错:

SELECT 
    NameVer,
    Ver,
    CASE 
        WHEN CHARINDEX('-' + Ver, NameVer) > 0 
        THEN TRIM(SUBSTRING(NameVer, 1, CHARINDEX('-' + Ver, NameVer) - 1))
        ELSE TRIM(NameVer)  -- 没有匹配到的话,返回trim后的原字段
    END AS Name
FROM myTable

内容的提问来源于stack exchange,提问作者pacpac1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:58:09