求筛选内容.然后更新...

poloyzhang 2014-11-24 02:33:00


老调重弹.
怎么更新时出现一样的错误

LID bT
60000 A
60001 A
60002 B
600ab B
99208 A
99209 B
9920a A
99210 A
9999 B
HA014K1 A
60010 A
HA016K1 A

数据如上例: 需要筛选出是 数字的 LID (包括字母和数字) 同时需要找出 LID 60000-60010 并且90000 - 99210 的所有 LID 的记录.

1.查询出 lid 为 60000-60010 或者 90000-99209 之间的记录(都为数字).
2. 更新 60000-60010 或者 90000-99209 字段 BT 值为 B


...全文
186 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2014-11-25
  • 打赏
  • 举报
回复
引用 14 楼 poloyzhang 的回复:
len(lid)=5 也不是很好. 万一要查询 4-5位的呢 即 9000 - 20000 之间的数据.
如果是按数值范围的,就在排除字母后,再转为数值进行between好了
还在加载中灬 2014-11-25
  • 打赏
  • 举报
回复
引用 8 楼 poloyzhang 的回复:

--------------开始查询--------------------------
SELECT * FROM (select CAST(LID AS INT ) lid from [tb]
WHERE ISNUMERIC(lid)=1 ) A 
WHERE (A.LID BETWEEN 60000 AND 60010 ) OR (A.LID BETWEEN 90000 AND 99210)
----------------结果----------------------------
/* 

之前有个大牛是这样查的, 但是我用做更新时还是出问题. 好像用引号在有时候不行.
不明白 [用引号在] 什么意思
SELECT * FROM TbA WHERE ISNUMERIC(lid)=1 AND(lid BETWEEN 60000 AND 60010 OR lid BETWEEN 90000 AND 99210)

UPDATE TbA SET bt='B' WHERE ISNUMERIC(lid)=1 AND(lid BETWEEN 60000 AND 60010 OR lid BETWEEN 90000 AND 99210)
poloyzhang 2014-11-25
  • 打赏
  • 举报
回复
len(lid)=5 也不是很好. 万一要查询 4-5位的呢 即 9000 - 20000 之间的数据.
haitao 2014-11-25
  • 打赏
  • 举报
回复
引用 11 楼 poloyzhang 的回复:
这个也不对. 有些短数据也会出来. 会出来这下面这个样子 20016 2002 20021 20022 20023 20024 2003 而我要的结果是 20016 20021 20022 20023 20024
把我楼上的where改为 where ( PATINDEX('%[^0-9]%',lid))=0 and len(lid)=5
haitao 2014-11-25
  • 打赏
  • 举报
回复

declare @t Table (  lid varchar(10) not null ,  bt varchar(10) not null  )

insert @t 
select '60000',	'A'	union all 
select '60001',	'A'	union all 
select '60002',	'B'	union all 
select '60002'	,'B'	union all 
select '600ab',	'B'	union all 
select '99208',	'A'	union all 
select '99209',	'B'	union all 
select '9920a',	'A'	union all 
select '99210',	'A'	union all 
select '9999',	'B'	union all 
select 'HA014K1', 'A'	union all 
select '60010',	 'A'	union all 
select 'HA016K1',	'A'	

select * from @t
where (PATINDEX('%[^0-9]%',lid))=0 

update @t
set bt='B'
where ( PATINDEX('%[^0-9]%',lid))=0 

select * from @t
poloyzhang 2014-11-25
  • 打赏
  • 举报
回复
这个也不对. 有些短数据也会出来. 会出来这下面这个样子 20016 2002 20021 20022 20023 20024 2003 而我要的结果是 20016 20021 20022 20023 20024
poloyzhang 2014-11-25
  • 打赏
  • 举报
回复
对了. 收工. 是数据语句写法的问题. 我自己怎么就写不出来呢. 总结


 

 use TempTest 
  go   
  if OBJECT_ID ('Tb1') is not null drop table Tb1 
  Create Table Tb1  (
  colKey varchar(10) not null primary key ,
  col1 varchar(10) null,
  col2 varchar (10)  null
  )

Insert into Tb1 
Select  'key1' , 'row1' , '2000'  union all 
Select  'key2' , 'row2' , '2001'  union all 
Select  'key3' , 'row3' , '2a02'  union all 
Select  'key4' , 'row4' , '2003'  union all 
Select  'key5' , 'row5' , '200b'  union all 
Select  'key6' , 'row6' , '90000'  union all 
Select  'key7' , 'row7' , '900aa'  union all 
Select  'key8' , 'row8' , '9b002'  union all 
Select  'key9' , 'row9' , '90003'  union all 
Select  'key10' , 'row10' , '90004' 


SELECT [colKey],[col1],[col2] FROM [TempTest].[dbo].[Tb1]

------要求查出col2 2000-2003 或者90000 - 90004 的值的行
SELECT * FROM Tb1 WHERE ISNUMERIC(col2)=1 AND(col2 BETWEEN 2000 AND 2003 OR col2 BETWEEN 90000 AND 90004) order by col2

-------将col2 2000-2003 或者90000 - 90004 的值的行的COL1 的值设置为N 
UPDATE Tb1 SET col1='N'  WHERE ISNUMERIC(col2)=1 AND(col2 BETWEEN 2000 AND 2003 OR col2 BETWEEN 90000 AND 90004) 






中国风 2014-11-24
  • 打赏
  • 举报
回复
引用 8 楼 poloyzhang 的回复:

--------------开始查询--------------------------
SELECT * FROM (select CAST(LID AS INT ) lid from [tb]
WHERE ISNUMERIC(lid)=1 ) A 
WHERE (A.LID BETWEEN 60000 AND 60010 ) OR (A.LID BETWEEN 90000 AND 99210)
----------------结果----------------------------
/* 

之前有个大牛是这样查的, 但是我用做更新时还是出问题. 好像用引号在有时候不行.
不能用ISNUMERIC,小数点时不能处理,用以上5#正确答案,你报错信息应该就是用的这个语句,条件没有用字符
Tiger_Zhao 2014-11-24
  • 打赏
  • 举报
回复
UPDATE 再和原表关联时,要将 INT 型的 A.lid 再转成 varchar 型。
否则会试图把 [tb].LID 转成 INT 型和 A.lid 关联。
poloyzhang 2014-11-24
  • 打赏
  • 举报
回复

--------------开始查询--------------------------
SELECT * FROM (select CAST(LID AS INT ) lid from [tb]
WHERE ISNUMERIC(lid)=1 ) A 
WHERE (A.LID BETWEEN 60000 AND 60010 ) OR (A.LID BETWEEN 90000 AND 99210)
----------------结果----------------------------
/* 

之前有个大牛是这样查的, 但是我用做更新时还是出问题. 好像用引号在有时候不行.
poloyzhang 2014-11-24
  • 打赏
  • 举报
回复
use TempTest go if OBJECT_ID ('TbA') is not null drop table TbA Create Table TbA ( lid varchar(10) not null , bt varchar ( 10 ) not null, ) insert TbA select '60000', 'A' union all select '60001', 'A' union all select '60002', 'B' union all select '60002' ,'B' union all select '600ab', 'B' union all select '99208', 'A' union all select '99209', 'B' union all select '9920a', 'A' union all select '99210', 'A' union all select '9999', 'B' union all select 'HA014K1', 'A' union all select '60010', 'A' union all select 'HA016K1', 'A'
中国风 2014-11-24
  • 打赏
  • 举报
回复
用5#方法,前面少敲了%和( ,注意要加上引用条件
中国风 2014-11-24
  • 打赏
  • 举报
回复
引用 3 楼 poloyzhang 的回复:
消息 245,级别 16,状态 1,第 2 行 在将 varchar 值 '600ab' 转换成数据类型 int 时失败
用引用
--1.查询出 lid 为 60000-60010 或者 90000-99209 之间的记录(都为数字).
SELECT * FROM TableA WHERE (LID BETWEEN '60000' AND '60010' OR LID BETWEEN '90000' AND '99209') AND LID NOT LIKE '%[^0-9]%'
--2. 更新  60000-60010 或者 90000-99209  字段 BT 值为 B
 
UPDATE  TableA  SET BT='B'WHERE (LID BETWEEN '60000' AND '60010' OR LID BETWEEN '90000' AND '99209') AND LID NOT LIKE  '%[^0-9]%'
中国风 2014-11-24
  • 打赏
  • 举报
回复
引用 3 楼 poloyzhang 的回复:
消息 245,级别 16,状态 1,第 2 行 在将 varchar 值 '600ab' 转换成数据类型 int 时失败
用引用
--1.查询出 lid 为 60000-60010 或者 90000-99209 之间的记录(都为数字).
SELECT * FROM TableA WHERE LID BETWEEN '60000' AND '60010' OR LID BETWEEN '90000' AND '99209' AND LID NOT LIKE '%[^0-9]%'
--2. 更新  60000-60010 或者 90000-99209  字段 BT 值为 B
 
UPDATE  TableA  SET BT='B'WHERE LID BETWEEN '60000' AND '60010' OR LID BETWEEN '90000' AND '99209' AND LID NOT LIKE '[^0-9]' 
poloyzhang 2014-11-24
  • 打赏
  • 举报
回复
消息 245,级别 16,状态 1,第 2 行 在将 varchar 值 '600ab' 转换成数据类型 int 时失败
發糞塗牆 2014-11-24
  • 打赏
  • 举报
回复
大版,第二句改成update
中国风 2014-11-24
  • 打赏
  • 举报
回复
--1.查询出 lid 为 60000-60010 或者 90000-99209 之间的记录(都为数字).
SELECT * FROM TableA WHERE LID BETWEEN '60000' AND '60010' OR LID BETWEEN '90000' AND '99209' AND LID NOT LIKE '[^0-9]'
--2. 更新  60000-60010 或者 90000-99209  字段 BT 值为 B

SELECT * FROM TableA WHERE LID BETWEEN '60000' AND '60010' OR LID BETWEEN '90000' AND '99209' AND LID NOT LIKE '[^0-9]' AND BT='B'

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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