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

关于CHARINDEX与SUBSTRING提取成本及新增列赋值的问题

解决你的两个SQL技术问题

嘿,让我来帮你搞定这两个SQL问题:

1. 提取Campaign列中的成本部分

你已经找对了方向,用SUBSTRING结合CHARINDEX就能解决,关键是通过嵌套CHARINDEX定位到$之后的第一个*,从而算出需要截取的长度。这里有两种可行的写法:

通用SQL写法(适用于SQL Server、PostgreSQL等)

SELECT 
  SUBSTRING(
    Campaign,
    CHARINDEX('$', Campaign) + 1,
    CHARINDEX('*', Campaign, CHARINDEX('$', Campaign) + 1) - CHARINDEX('$', Campaign) - 1
  ) AS ExtractedCost
FROM YourTable;

逻辑拆解:

  • CHARINDEX('$', Campaign)找到$的位置,加1就是成本数字的起始索引
  • CHARINDEX('*', Campaign, CHARINDEX('$', Campaign)+1)从$的下一个字符开始,找第一个*的位置
  • 用第二个CHARINDEX的结果减去第一个的结果再减1,就是成本字符串的准确长度,刚好截取到*之前的所有内容

更简洁的写法(适用于MySQL)

如果你的数据库支持SUBSTRING_INDEX,可以用更直观的嵌套调用:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(Campaign, '$', -1), '*', 1) AS ExtractedCost
FROM YourTable;

先截取$之后的所有内容,再从这部分内容里截取第一个*之前的部分,一步到位。

2. 高效新增列并赋值的方法

当然有更高效的方式,不用分开执行ALTER和UPDATE,根据你的需求和数据库类型,有两种最优方案:

方案1:使用计算列(推荐动态维护场景)

如果这个成本值需要随着Campaign列的变化自动更新,直接创建计算列是最佳选择,数据库会自动维护它的值,不需要手动执行UPDATE:

ALTER TABLE T 
ADD NewColumn AS (
  SUBSTRING(
    Campaign,
    CHARINDEX('$', Campaign) + 1,
    CHARINDEX('*', Campaign, CHARINDEX('$', Campaign) + 1) - CHARINDEX('$', Campaign) - 1
  )
) VARCHAR(100);

如果希望计算列的值被物理存储(提升查询性能,仅SQL Server支持),可以加上PERSISTED关键字:

ALTER TABLE T 
ADD NewColumn AS (
  SUBSTRING(
    Campaign,
    CHARINDEX('$', Campaign) + 1,
    CHARINDEX('*', Campaign, CHARINDEX('$', Campaign) + 1) - CHARINDEX('$', Campaign) - 1
  )
) VARCHAR(100) PERSISTED;

方案2:一次性初始化列(适用于静态赋值场景)

如果只是想给现有行一次性赋值,之后不需要动态更新,部分数据库支持在ALTER TABLE时直接指定基于其他列的默认值(比如MySQL):

ALTER TABLE T 
ADD NewColumn VARCHAR(100) DEFAULT (
  SUBSTRING_INDEX(SUBSTRING_INDEX(Campaign, '$', -1), '*', 1)
);

注意:这种语法不是所有数据库都支持,比如SQL Server就无法直接在ADD列时使用基于其他列的默认值,这时候计算列仍然是更好的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:14:50