CHARINDEX和SUBSTRING的选择中的问题

时间:2019-03-09 13:56:16

标签: sql sql-server

我在这里有2个问题。

  1. 我有一个带有这些条目的“广告系列”列。我的目标是从字符串中提取“费用”部分,并在表格中创建一个新的“费用”列

    29693214 - Live -JUTL Phase 2 Creator Stories Trailer  * 7.12 - 7.25 * Video Views * $28,169.01 * BG - Mob
    89695072 - Live -WUTL Retargeting JG  * 7.16 - 7.31 * Link Clicks * $23,474.18 * KG - Mob
    

    我尝试了select SUBSTRING(Campaign,CHARINDEX('$',Campaign) +1,???)。我无法找出'???'部分。我想从“ $”旁边的索引开始,一直到“ *”符号以捕获成本。

    在创建新列时,请按照以下步骤操作

    Alter table T ADD NewColumn varchar(100)
    
  2. 然后我这样做

    Update T SET NewColumn = 'Say I want that cost part from the above question here'
    

    有什么有效的方法可以一次完成吗?

2 个答案:

答案 0 :(得分:1)

我认为apply使这些操作更简单:

select left(v1.str1, charindex(' ', v1.str1))
from (values ('29693214 - Live -JUTL Phase 2 Creator Stories Trailer * 7.12 - 7.25 * Video Views * $28,169.01 * BG - Mob')) v(str) cross apply
     (values (stuff(str, 1, charindex('$', str), ''))) v1(str1);

可以很容易地将其合并到update中:

Update t
    set newcolumn = left(v.str1, charindex(' ', v.str1))
    from t cross apply
         (values (stuff(t.str, 1, charindex('$', str), ''))) v(str1)

答案 1 :(得分:0)

用于测试查询的DDL:

declare @tbl table(Campaign varchar(200));
insert into @tbl values
('29693214 - Live -JUTL Phase 2 Creator Stories Trailer * 7.12 - 7.25 * Video Views * $28,169.01 * BG - Mob'),
('189695072 - Live -WUTL Retargeting JG * 7.16 - 7.31 * Link Clicks * $23,474.18 * KG - Mob');

如果费用始终与字符串的其他部分之间用星号*隔开,则可以使用以下查询:

select trim(substring(Campaign, dollarIndex + 1, asteriskIndex - dollarIndex - 1)) from (
    select Campaign, charindex('$', Campaign) dollarIndex,
           charindex('*', Campaign, charindex('$', Campaign)) asteriskIndex
    from @tbl
) a

要在update语句中使用它,可以使用相同的查询,但是我们需要将以上内容转换为单个查询:

update @tbl set Campaign = trim(substring(Campaign, charindex('$', Campaign) + 1, charindex('*', Campaign, charindex('$', Campaign)) - charindex('$', Campaign) - 1))

注意:考虑是否值得保留您已有的数据(冗余)。如果始终可以使用可以将view用于此任务的相同方式从您的列中进行解析。

另一方面,查询此类数据可能会花费很多,而且可能会降低性能。