我在这里有2个问题。
我有一个带有这些条目的“广告系列”列。我的目标是从字符串中提取“费用”部分,并在表格中创建一个新的“费用”列
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)
然后我这样做
Update T SET NewColumn = 'Say I want that cost part from the above question here'
有什么有效的方法可以一次完成吗?
答案 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用于此任务的相同方式从您的列中进行解析。
另一方面,查询此类数据可能会花费很多,而且可能会降低性能。