SQL值替换

HuoLarry 2014-03-11 12:18:48
表名:Agent_Call
列名:Called_NUM
值:
18102261555
2018102162222
2018912345678
2018814567892

如何批量去掉前面包含20的值,我需要得到一张不包含20的Called_NUM。

业务逻辑是这样的:
每天我会从一个呼叫系统中,导出昨天的被叫号码(Called_NUM),所以每天都会有前置是20的值出现,
现在已经存在DB中有一年的数据,如何一个SQL更新所有前置是20的值呢?
...全文
133 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
山寨DBA 2014-03-11
  • 打赏
  • 举报
回复
引用 2 楼 hwhmh2010 的回复:
刚才给你的代码把这里变更下:where Agent_Call like '20%' 变成这样:where Called_NUM like '20%' 简易测试下:

create table Agent_Call (Called_NUM varchar(100))

insert into Agent_Call
select '18102261555' union
select '2018102162222' union
select '2018912345678' union
select '2018814567892'

update 
	a 
set 
	a.Called_NUM=Temp_linshi.Called_NUM_2 
from 
	Agent_Call a,
	(
		select 
			Called_NUM,
			substring(Called_NUM,3,len(Called_NUM)) as Called_NUM_2 
		from 
			Agent_Call 
		where 
			Called_NUM like '20%'
	) Temp_linshi

where 
	a.Called_NUM=Temp_linshi.Called_NUM

结果 Called_NUM 18102261555 18102162222 18814567892 18912345678
如果在非开头部位出现了20怎么办呢?比如:2018102162022 或者18102061555
發糞塗牆 2014-03-11
  • 打赏
  • 举报
回复
update不用写了吧?
----------------------------------------------------------------
-- Author  :DBA_HuangZJ(发粪涂墙)
-- Date    :2014-03-11 12:39:35
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
--	Apr  2 2010 15:48:46 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据[Agent_Call]
if object_id('[Agent_Call]') is not null drop table [Agent_Call]
go 
create table [Agent_Call]([Called_NUM] bigint)
insert [Agent_Call]
select 18102261555 union all
select 2018102162222 union all
select 2018912345678 union all
select 2018814567892
--------------生成数据--------------------------

select REPLACE([Called_NUM],'20','')new_Called_NUM 
from [Agent_Call]
----------------结果----------------------------
/* new_Called_NUM
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
18102261555
18102162222
18912345678
18814567892
*/
山寨DBA 2014-03-11
  • 打赏
  • 举报
回复
刚才给你的代码把这里变更下:where Agent_Call like '20%' 变成这样:where Called_NUM like '20%' 简易测试下:

create table Agent_Call (Called_NUM varchar(100))

insert into Agent_Call
select '18102261555' union
select '2018102162222' union
select '2018912345678' union
select '2018814567892'

update 
	a 
set 
	a.Called_NUM=Temp_linshi.Called_NUM_2 
from 
	Agent_Call a,
	(
		select 
			Called_NUM,
			substring(Called_NUM,3,len(Called_NUM)) as Called_NUM_2 
		from 
			Agent_Call 
		where 
			Called_NUM like '20%'
	) Temp_linshi

where 
	a.Called_NUM=Temp_linshi.Called_NUM

结果 Called_NUM 18102261555 18102162222 18814567892 18912345678
山寨DBA 2014-03-11
  • 打赏
  • 举报
回复
我这里没有表,你测试下试试

update a set a.Called_NUM=Temp_linshi.Called_NUM_2 
from Agent_Call a,
	(
		select 
			Called_NUM,
			substring(Called_NUM,3,len(Called_NUM)) as Called_NUM_2 
		from 
			Agent_Call 
		where 
			Agent_Call like '20%'
	) Temp_linshi

where a.Called_NUM=Temp_linshi.Called_NUM
山寨DBA 2014-03-11
  • 打赏
  • 举报
回复
一转眼,你们说了这么多,技术还是越讨论越热闹,越牛逼啊。。。 float类型不能使用substring函数,先转换成varchar吧
發糞塗牆 2014-03-11
  • 打赏
  • 举报
回复
HuoLarry 2014-03-11
  • 打赏
  • 举报
回复
感谢大家的帮助,已经解决了。 更新表:首先要吧called_num 转为varchar类型,执行4楼的方法。 查询表:执行select substring([Called_NUM],3,len([Called_NUM])) from [Agent_Call] 再次感激大家的协助,支持CSDN!!!
HuoLarry 2014-03-11
  • 打赏
  • 举报
回复
引用 14 楼 DBA_Huangzj 的回复:
select substring([Called_NUM],2,len([Called_NUM])) from [Agent_Call]
查询的话,这里要更改为: select substring([Called_NUM],3,len([Called_NUM])) from [Agent_Call] 这样查询就OK了,我从bigint转换为char就可以用substring了。
發糞塗牆 2014-03-11
  • 打赏
  • 举报
回复
类型转换的话,不能直接转就转两次
發糞塗牆 2014-03-11
  • 打赏
  • 举报
回复
select substring([Called_NUM],2,len([Called_NUM])) from [Agent_Call]
HuoLarry 2014-03-11
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
update不用写了吧?
----------------------------------------------------------------
-- Author  :DBA_HuangZJ(发粪涂墙)
-- Date    :2014-03-11 12:39:35
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
--	Apr  2 2010 15:48:46 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据[Agent_Call]
if object_id('[Agent_Call]') is not null drop table [Agent_Call]
go 
create table [Agent_Call]([Called_NUM] bigint)
insert [Agent_Call]
select 18102261555 union all
select 2018102162222 union all
select 2018912345678 union all
select 2018814567892
--------------生成数据--------------------------

select REPLACE([Called_NUM],'20','')new_Called_NUM 
from [Agent_Call]
----------------结果----------------------------
/* new_Called_NUM
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
18102261555
18102162222
18912345678
18814567892
*/
这个方法倒是适合我举的例子,但是现实中还有‘2013826206295’这样的号码, 如果按照你的方法,号码就缩水了。变为:138266295了。 我觉得应该找2个方案, 第一种是更新表,(暂时好像是数据类型的原因) 第二种应对查询。(DBA_huang)的再修改一下应该可以应付
發糞塗牆 2014-03-11
  • 打赏
  • 举报
回复
先转成varchar再转bigint试试
HuoLarry 2014-03-11
  • 打赏
  • 举报
回复
大神们,我的called_num是float类型,转换为bigint也是不行的。 SQL报错,提示:参数数据类型bigint对于substring函数的参数1无效。
發糞塗牆 2014-03-11
  • 打赏
  • 举报
回复
不是说不要用float吗?
發糞塗牆 2014-03-11
  • 打赏
  • 举报
回复
UPDATE [Agent_Call] SET [Called_NUM]=REPLACE([Called_NUM],'20','')
HuoLarry 2014-03-11
  • 打赏
  • 举报
回复
引用 7 楼 19850713 的回复:
[quote=引用 5 楼 19850713 的回复:] [quote=引用 4 楼 hwhmh2010 的回复:] [quote=引用 2 楼 hwhmh2010 的回复:] 刚才给你的代码把这里变更下:where Agent_Call like '20%' 变成这样:where Called_NUM like '20%' 简易测试下:

create table Agent_Call (Called_NUM varchar(100))

insert into Agent_Call
select '18102261555' union
select '2018102162222' union
select '2018912345678' union
select '2018814567892'

update 
	a 
set 
	a.Called_NUM=Temp_linshi.Called_NUM_2 
from 
	Agent_Call a,
	(
		select 
			Called_NUM,
			substring(Called_NUM,3,len(Called_NUM)) as Called_NUM_2 
		from 
			Agent_Call 
		where 
			Called_NUM like '20%'
	) Temp_linshi

where 
	a.Called_NUM=Temp_linshi.Called_NUM

结果 Called_NUM 18102261555 18102162222 18814567892 18912345678
如果在非开头部位出现了20怎么办呢?比如:2018102162022 或者18102061555[/quote] 这个不会出现的,不用考虑那么复杂,因为是外拨号码,通过特殊系统拨打出去会自动前面加上020,导出后就变成20了。所以只会有一种情况,就是20在前2位。感谢!!![/quote] 这个语句AS部分报错,提示关键字as附近有语法错误。[/quote] 已经修正了,可以执行,但是我的Called_NUM数据类型是Float,需要转换一下再试试。
HuoLarry 2014-03-11
  • 打赏
  • 举报
回复
引用 5 楼 19850713 的回复:
[quote=引用 4 楼 hwhmh2010 的回复:] [quote=引用 2 楼 hwhmh2010 的回复:] 刚才给你的代码把这里变更下:where Agent_Call like '20%' 变成这样:where Called_NUM like '20%' 简易测试下:

create table Agent_Call (Called_NUM varchar(100))

insert into Agent_Call
select '18102261555' union
select '2018102162222' union
select '2018912345678' union
select '2018814567892'

update 
	a 
set 
	a.Called_NUM=Temp_linshi.Called_NUM_2 
from 
	Agent_Call a,
	(
		select 
			Called_NUM,
			substring(Called_NUM,3,len(Called_NUM)) as Called_NUM_2 
		from 
			Agent_Call 
		where 
			Called_NUM like '20%'
	) Temp_linshi

where 
	a.Called_NUM=Temp_linshi.Called_NUM

结果 Called_NUM 18102261555 18102162222 18814567892 18912345678
如果在非开头部位出现了20怎么办呢?比如:2018102162022 或者18102061555[/quote] 这个不会出现的,不用考虑那么复杂,因为是外拨号码,通过特殊系统拨打出去会自动前面加上020,导出后就变成20了。所以只会有一种情况,就是20在前2位。感谢!!![/quote] 这个语句AS部分报错,提示关键字as附近有语法错误。
發糞塗牆 2014-03-11
  • 打赏
  • 举报
回复
3楼的可以不?
HuoLarry 2014-03-11
  • 打赏
  • 举报
回复
引用 4 楼 hwhmh2010 的回复:
[quote=引用 2 楼 hwhmh2010 的回复:] 刚才给你的代码把这里变更下:where Agent_Call like '20%' 变成这样:where Called_NUM like '20%' 简易测试下:

create table Agent_Call (Called_NUM varchar(100))

insert into Agent_Call
select '18102261555' union
select '2018102162222' union
select '2018912345678' union
select '2018814567892'

update 
	a 
set 
	a.Called_NUM=Temp_linshi.Called_NUM_2 
from 
	Agent_Call a,
	(
		select 
			Called_NUM,
			substring(Called_NUM,3,len(Called_NUM)) as Called_NUM_2 
		from 
			Agent_Call 
		where 
			Called_NUM like '20%'
	) Temp_linshi

where 
	a.Called_NUM=Temp_linshi.Called_NUM

结果 Called_NUM 18102261555 18102162222 18814567892 18912345678
如果在非开头部位出现了20怎么办呢?比如:2018102162022 或者18102061555[/quote] 这个不会出现的,不用考虑那么复杂,因为是外拨号码,通过特殊系统拨打出去会自动前面加上020,导出后就变成20了。所以只会有一种情况,就是20在前2位。感谢!!!

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧