求助,sql2005中一个困扰我很久的查询~

pard521 2013-12-21 11:43:25
例如 表table_1:
ID GYLX
1 3j-4b-5x
2 4b-3j-7zp
3 12zp
4 0g
5
GYLX列中允许有空值

我的结果是将 GYLX列中最后一个包含数字0的查出来
或者最后一个包含数字7的结果查询出来

求大侠帮忙查询
...全文
239 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
pard521 2013-12-24
  • 打赏
  • 举报
回复
我试验了 只有20喽的满足我 ,其余的如果数字两位数以上就不行了~
唐诗三百首 2013-12-23
  • 打赏
  • 举报
回复

create table pard(ID int,GYLX varchar(20))

insert into pard
 select 6,'0G-11DX' union all
 select 7,'3J-0G' union all
 select 8,'3J-0G' union all
 select 9,'3J-0G-4ZB'
 

-- GYLX列中最后一个包含数字0的
select * 
 from pard 
 where substring(reverse(GYLX),
                 patindex('%[0-9]%',reverse(GYLX)),
                 1)='0'

/*
ID          GYLX
----------- --------------------
7           3J-0G
8           3J-0G

(2 row(s) affected)
*/


-- GYLX列中最后一个包含数字4的
select * 
 from pard 
 where substring(reverse(GYLX),
                 patindex('%[0-9]%',reverse(GYLX)),
                 1)='4'

/*
ID          GYLX
----------- --------------------
9           3J-0G-4ZB

(1 row(s) affected)
*/
lzw_0736 2013-12-23
  • 打赏
  • 举报
回复

create table #temp(ID  int,    GYLX varchar(100))
 
insert into #temp
SELECT 8,'3J-0G' UNION ALL 
SELECT 9,'3J-0G-4ZB'

;WITH a1 AS
(
SELECT id,REVERSE(gylx) gylx FROM #temp
)
,a2 AS
(
SELECT *,CASE WHEN CHARINDEX('-',gylx)>0 THEN LEFT(gylx,CHARINDEX('-',gylx)-1) ELSE gylx END gylx2
FROM a1
)
SELECT * FROM #temp WHERE id =
(
SELECT MAX(id)
FROM a2
WHERE CHARINDEX('0',gylx2)>0 OR CHARINDEX('7',gylx2)>0
)
LongRui888 2013-12-23
  • 打赏
  • 举报
回复
引用 19 楼 pard521 的回复:
[quote=引用 17 楼 yupeigu 的回复:] [quote=引用 15 楼 pard521 的回复:] [quote=引用 12 楼 yupeigu 的回复:] [quote=引用 9 楼 pard521 的回复:] [quote=引用 2 楼 yupeigu 的回复:]
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''        
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(partition by case when GYLX like '%0%' then 0
                                           when GYLX like '%7%' then 7
                                      end  order by id desc) rownum
from table_1
where GYLX like '%0%' or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
4	0g
2	4b-3j-7zp
*/
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX[/quote] 是这样吗:
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''   union all
select 6     ,'0G-11DX' union all
select 7     ,'3J-0G'    
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(order by id desc) rownum
from table_1
where GYLX like '%0%' --or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
7	3J-0G
*/
[/quote] 还有一种情况刚才忘说了: 比如 : 8 3J-0G 9 3J-0G-4ZB 我只想要: 8 3J-0G 不要 9 3J-0G-4ZB[/quote] 这个有什么判断规则不[/quote] 没什么判断规则,这个GYLX比较乱 什么情况都可能发生 但是都是由数字和字符组成我需要判断的是 字符串中最后一个数字是0或者别的数字(这个数字是可以随便输入的)[/quote] 这样吗:
--drop table table_1

create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''   union all
select 6     ,'0G-11DX' union all
select 7     ,'3J-0G' union all
select 8  ,'3J-0G' union all
select 9  ,'3J-0G-4ZB' 
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(order by charindex('0',reverse(GYLX)) ,id desc) rownum
from table_1
where GYLX like '%0%' --or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
8	3J-0G
*/
發糞塗牆 2013-12-23
  • 打赏
  • 举报
回复
引用 19 楼 pard521 的回复:
[quote=引用 17 楼 yupeigu 的回复:] [quote=引用 15 楼 pard521 的回复:] [quote=引用 12 楼 yupeigu 的回复:] [quote=引用 9 楼 pard521 的回复:] [quote=引用 2 楼 yupeigu 的回复:]
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''        
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(partition by case when GYLX like '%0%' then 0
                                           when GYLX like '%7%' then 7
                                      end  order by id desc) rownum
from table_1
where GYLX like '%0%' or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
4	0g
2	4b-3j-7zp
*/
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX[/quote] 是这样吗:
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''   union all
select 6     ,'0G-11DX' union all
select 7     ,'3J-0G'    
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(order by id desc) rownum
from table_1
where GYLX like '%0%' --or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
7	3J-0G
*/
[/quote] 还有一种情况刚才忘说了: 比如 : 8 3J-0G 9 3J-0G-4ZB 我只想要: 8 3J-0G 不要 9 3J-0G-4ZB[/quote] 这个有什么判断规则不[/quote] 没什么判断规则,这个GYLX比较乱 什么情况都可能发生 但是都是由数字和字符组成我需要判断的是 字符串中最后一个数字是0或者别的数字(这个数字是可以随便输入的)[/quote]看看我18楼的行不行
pard521 2013-12-23
  • 打赏
  • 举报
回复
引用 17 楼 yupeigu 的回复:
[quote=引用 15 楼 pard521 的回复:] [quote=引用 12 楼 yupeigu 的回复:] [quote=引用 9 楼 pard521 的回复:] [quote=引用 2 楼 yupeigu 的回复:]
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''        
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(partition by case when GYLX like '%0%' then 0
                                           when GYLX like '%7%' then 7
                                      end  order by id desc) rownum
from table_1
where GYLX like '%0%' or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
4	0g
2	4b-3j-7zp
*/
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX[/quote] 是这样吗:
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''   union all
select 6     ,'0G-11DX' union all
select 7     ,'3J-0G'    
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(order by id desc) rownum
from table_1
where GYLX like '%0%' --or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
7	3J-0G
*/
[/quote] 还有一种情况刚才忘说了: 比如 : 8 3J-0G 9 3J-0G-4ZB 我只想要: 8 3J-0G 不要 9 3J-0G-4ZB[/quote] 这个有什么判断规则不[/quote] 没什么判断规则,这个GYLX比较乱 什么情况都可能发生 但是都是由数字和字符组成我需要判断的是 字符串中最后一个数字是0或者别的数字(这个数字是可以随便输入的)
發糞塗牆 2013-12-23
  • 打赏
  • 举报
回复
先创建函数
--create function [dbo].[m_getnumberV2.0]
--(
--       @mysql_one nvarchar(200)
--)
--returns varchar(200)
--begin
--    declare @mysql_two varchar(200)
--    declare @sql_one int
--    declare @sql_two int
--    select @sql_one= patindex('%[0-9.]%',@mysql_one)
--    select @sql_two=
--    patindex('%[^0-9.]%',
--    substring(@mysql_one,patindex('%[0-9.]%',@mysql_one),len(@mysql_one)-patindex('%[0-9.]%',@mysql_one)+1))
--    if @sql_two=0
--       begin
--           select @mysql_two= substring (@mysql_one,@sql_one,len(@mysql_one)+1-@sql_one)
--       end
--    else
--       begin
--           select @mysql_two=substring (@mysql_one,@sql_one,@sql_two-1)
--       end
--    return @mysql_two;
--end

----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-12-23 11:13:23
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--	Dec 28 2012 20:23:12 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[table_1]
if object_id('[table_1]') is not null drop table [table_1]
go 
create table [table_1]([ID] int,[GYLX] varchar(9))
insert [table_1]
select 1,'3j-4b-5x' union all
select 2,'4b-3j-7zp' union all
select 3,'12zp' union all
select 4,'0g' union all
select 5,null
--------------开始查询--------------------------

select * 
from [table_1]
WHERE [dbo].[m_getnumberV2.0](REVERSE([GYLX])) IN (0,7)
----------------结果----------------------------
/* 
ID          GYLX
----------- ---------
2           4b-3j-7zp
4           0g

*/
LongRui888 2013-12-23
  • 打赏
  • 举报
回复
引用 15 楼 pard521 的回复:
[quote=引用 12 楼 yupeigu 的回复:] [quote=引用 9 楼 pard521 的回复:] [quote=引用 2 楼 yupeigu 的回复:]
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''        
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(partition by case when GYLX like '%0%' then 0
                                           when GYLX like '%7%' then 7
                                      end  order by id desc) rownum
from table_1
where GYLX like '%0%' or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
4	0g
2	4b-3j-7zp
*/
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX[/quote] 是这样吗:
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''   union all
select 6     ,'0G-11DX' union all
select 7     ,'3J-0G'    
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(order by id desc) rownum
from table_1
where GYLX like '%0%' --or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
7	3J-0G
*/
[/quote] 还有一种情况刚才忘说了: 比如 : 8 3J-0G 9 3J-0G-4ZB 我只想要: 8 3J-0G 不要 9 3J-0G-4ZB[/quote] 这个有什么判断规则不
發糞塗牆 2013-12-23
  • 打赏
  • 举报
回复
额,我以为你说数据的最后一位是数字呢。开完会再看
pard521 2013-12-23
  • 打赏
  • 举报
回复
引用 12 楼 yupeigu 的回复:
[quote=引用 9 楼 pard521 的回复:] [quote=引用 2 楼 yupeigu 的回复:]
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''        
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(partition by case when GYLX like '%0%' then 0
                                           when GYLX like '%7%' then 7
                                      end  order by id desc) rownum
from table_1
where GYLX like '%0%' or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
4	0g
2	4b-3j-7zp
*/
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX[/quote] 是这样吗:
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''   union all
select 6     ,'0G-11DX' union all
select 7     ,'3J-0G'    
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(order by id desc) rownum
from table_1
where GYLX like '%0%' --or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
7	3J-0G
*/
[/quote] 还有一种情况刚才忘说了: 比如 : 8 3J-0G 9 3J-0G-4ZB 我只想要: 8 3J-0G 不要 9 3J-0G-4ZB
pard521 2013-12-23
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
select * from [table_1] WHERE SUBSTRING([gylx],LEN(gylx),1) IN ('0','7')
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX
pard521 2013-12-23
  • 打赏
  • 举报
回复
引用 5 楼 ap0405140 的回复:

-- GYLX列中最后一个包含数字0的
select top 1 * 
 from table_1
 where charindex('0',GYLX,1)>0
 order by ID desc

-- GYLX列中最后一个包含数字7的
select top 1 * 
 from table_1
 where charindex('7',GYLX,1)>0
 order by ID desc
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX
LongRui888 2013-12-23
  • 打赏
  • 举报
回复
引用 9 楼 pard521 的回复:
[quote=引用 2 楼 yupeigu 的回复:]
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''        
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(partition by case when GYLX like '%0%' then 0
                                           when GYLX like '%7%' then 7
                                      end  order by id desc) rownum
from table_1
where GYLX like '%0%' or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
4	0g
2	4b-3j-7zp
*/
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX[/quote] 是这样吗:
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''   union all
select 6     ,'0G-11DX' union all
select 7     ,'3J-0G'    
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(order by id desc) rownum
from table_1
where GYLX like '%0%' --or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
7	3J-0G
*/
pard521 2013-12-23
  • 打赏
  • 举报
回复
引用 3 楼 dotnetstudio 的回复:

select ID,GYLX from table_1
where RIGHT(GYLX,1)='0' or RIGHT(GYLX,1)='7'
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX
pard521 2013-12-23
  • 打赏
  • 举报
回复
引用 8 楼 tcmakebest 的回复:
这么个问题能困扰很久??
是啊,困扰我很久了,大神给我写一个看看? 可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX
pard521 2013-12-23
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
create table table_1(ID  int,    GYLX varchar(100))

insert into table_1
select 1      ,'3j-4b-5x' union all
select 2      ,'4b-3j-7zp' union all
select 3      ,'12zp' union all
select 4      ,'0g' union all
select 5      ,''        
go


select ID,GYLX
from 
(
select *,
       ROW_NUMBER() over(partition by case when GYLX like '%0%' then 0
                                           when GYLX like '%7%' then 7
                                      end  order by id desc) rownum
from table_1
where GYLX like '%0%' or GYLX like '%7%'
)t
where rownum = 1
/*
ID	GYLX
4	0g
2	4b-3j-7zp
*/
可能是我没说明白:如果我的数据库里有这么两条记录: ID GYLX 6 0G-11DX 7 3J-0G 我只想得到的结果是:就是GYLX里面有很多数字,我只想要最后一个数字是0的那条记录: 7 3J-0G 而不是: 6 0G-11DX
發糞塗牆 2013-12-22
  • 打赏
  • 举报
回复

select *
from [table_1]
WHERE SUBSTRING([gylx],LEN(gylx),1) IN ('0','7')
tcmakebest 2013-12-22
  • 打赏
  • 举报
回复
这么个问题能困扰很久??
Neo_whl 2013-12-22
  • 打赏
  • 举报
回复
select gylx from table_1 where gylx like '%[07]' 楼主看看可行?
t101lian 2013-12-22
  • 打赏
  • 举报
回复

select * from table_1  where GYLX like '%0' or GYLX like '%7'
楼主试试这个吧。
加载更多回复(4)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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