再放100分,如何截取字符串 开始 和 末尾可能存在的数字

FlowerJunjie 2009-09-14 03:25:29
asd123
123qwe
asd
qwe

得到
123
123
null
null
...全文
275 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
lidanzi 2009-09-15
  • 打赏
  • 举报
回复

DECLARE @a TABLE(a VARCHAR(200))
INSERT @a SELECT '13asd123'
UNION ALL SELECT '12a123ddf33'
UNION ALL SELECT 'addf123'
UNION ALL SELECT 'as5d'
UNION ALL SELECT 'qwe'

SELECT CASE WHEN PATINDEX('%[0-9]%',a)=1 THEN LEFT(a,PATINDEX('%[^0-9]%',a)-1)
WHEN PATINDEX('%[0-9]%',reverse(a))=1 THEN reverse(left(reverse(a),PATINDEX('%[^0-9]%',reverse(a))-1))
ELSE NULL
END a
FROM @a
--
a
13
12
123
NULL
NULL
oceantang 2009-09-15
  • 打赏
  • 举报
回复
jf

xiaoliaoyun 2009-09-14
  • 打赏
  • 举报
回复
这个简单。STUFF(a,1,PATINDEX('%[0-9]%',a)-1,'') 也可以用RIGHT(a,PATINDEX('%[0-9]%',a)-1)
[Quote=引用 12 楼 chuifengde 的回复:]

DECLARE @a TABLE(a VARCHAR(200))
INSERT @a SELECT 'asd123'
UNION ALL SELECT '123qwe'
UNION ALL SELECT 'asd'
UNION ALL SELECT 'qwe'

SELECT CASE WHEN PATINDEX('%[0-9]%',a)=1 THEN LEFT(a,PATINDEX('%[^0-9]%',a)-1)
WHEN PATINDEX('%[0-9]%',a)>1 THEN STUFF(a,1,PATINDEX('%[0-9]%',a)-1,'')
ELSE NULL
END a
FROM @a

[/Quote]
cxmcxm 2009-09-14
  • 打赏
  • 举报
回复
直接实现不了,只能用函数
create function dbo.getnumer(@str nvarchar(100))
returns nvarchar(100)
as
begin
declare @bz int,@ret nvarchar(100)
set @ret=''
if (@str like '[0-9]%')
set @bz=1
else if (@str like '%[0-9]')
begin
set @bz=2
set @str=reverse(@str)
end else
set @bz=0
if (@bz>0)
begin

while @str like '[0-9]%'
begin
set @ret=@ret+left(@str,1)
set @str=stuff(@str,1,1,'')
end
if (@bz=2)
set @ret=reverse(@ret)
end
return @ret
end
htl258_Tony 2009-09-14
  • 打赏
  • 举报
回复
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([col] NVARCHAR(10))
INSERT [tb]
SELECT 'asd123' UNION ALL
SELECT '123qwe' UNION ALL
SELECT 'asd' UNION ALL
SELECT 'qwe' UNION ALL
SELECT 'qw55e12' UNION ALL
SELECT '111qwe122'
GO
--SELECT * FROM [tb]

-->SQL查询如下:

IF NOT object_id('FN_STR') IS NULL
DROP FUNCTION fn_str
GO
CREATE FUNCTION fn_str(@col NVARCHAR(50))
RETURNS INT
BEGIN
SET @col=RTRIM(LTRIM(@col))
IF PATINDEX('%[0-9]%',LEFT(@col,1))+PATINDEX('%[0-9]%',RIGHT(@col,1))=0
RETURN NULL
ELSE
BEGIN
IF PATINDEX('%[0-9]%',LEFT(@col,1))>0
BEGIN
SET @col=STUFF(@col,1,PATINDEX('%[0-9]%',@col)-1,'')+'a'
SET @col=LEFT(@col,PATINDEX('%[^0-9]%',@col)-1)
END
ELSE
SET @col=RIGHT(@col,PATINDEX('%[^0-9]%',REVERSE(@col))-1)
END
RETURN @col
END
GO

SELECT dbo.FN_STR(col) as a FROM tb
/*
a
-----------
123
123
NULL
NULL
12
111

(6 行受影响)
*/
上面还有点小问题,再修改一下
FlowerJunjie 2009-09-14
  • 打赏
  • 举报
回复
忙着回复,还没仔细看代码呢!
htl258_Tony 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 flowerjunjie 的回复:]
引用 8 楼 chuifengde 的回复:
asd123WW46J
这个要得到什么结果?

这个不作处理
前面有数字的,取前面的数字,末尾有数字的,取末尾的数字
前后都有的,则取前面的,呵呵
sql版强人真多啊,版风也不错、建议其他板块向sql版的弟兄们学习。
有些函数我都没用过。nba
[/Quote]
15L
FlowerJunjie 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chuifengde 的回复:]
asd123WW46J
这个要得到什么结果?
[/Quote]
这个不作处理
前面有数字的,取前面的数字,末尾有数字的,取末尾的数字
前后都有的,则取前面的,呵呵

sql版强人真多啊,版风也不错、建议其他板块向sql版的弟兄们学习。
有些函数我都没用过。nba
沐浴-vip 2009-09-14
  • 打赏
  • 举报
回复
学习下~!
htl258_Tony 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 lihan6415151528 的回复:]
SQL codecreatefunction dbo.F_Get_Number (@Svarchar(100))returnsintASbeginwhilePATINDEX('%[^0-9]%',@S)>0beginset@s=stuff(@s,patindex('%[^0-9]%',@s),1,'')endreturncast(@Sasint)endGO

那个帖子里面已经写过了
[/Quote]
錯的。
lihan6415151528 2009-09-14
  • 打赏
  • 举报
回复

create function dbo.F_Get_Number (@S varchar(100))
returns int
AS
begin
while PATINDEX('%[^0-9]%',@S)>0
begin
set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
end
return cast(@S as int)
end
GO



那个帖子里面已经写过了
htl258_Tony 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 happyandsad 的回复:]
引用 1 楼 lunzi028 的回复:
SQL code--用函数来做createfunction[dbo].[F_Get_Number] (@Svarchar(100))returnsintASbeginwhilePATINDEX('%[^0-9]%',@S)>0beginset@s=stuff(@s,patindex('%[^0-9]%',@s),1,'')endreturncast(@Sasint)end

呵呵写的很干净
[/Quote]
樓主要判斷的是開始和末尾可能存在的。一樓的連中間的也考慮了。

--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([col] NVARCHAR(10))
INSERT [tb]
SELECT 'asd123' UNION ALL
SELECT '123qwe' UNION ALL
SELECT 'asd' UNION ALL
SELECT 'qwe' UNION ALL
SELECT 'qw55e' UNION ALL
SELECT '111qwe122'
GO
--用函数来做
create function [dbo].[F_Get_Number] (@S varchar(100))
returns int
AS
begin
while PATINDEX('%[^0-9]%',@S)>0
begin
set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
end
return cast(@S as int)
end
GO

SELECT dbo.[F_Get_Number]([col]) FROM tb
/*
-----------
123
123
0
0
55
111122

(6 行受影响)
*/
小宏 2009-09-14
  • 打赏
  • 举报
回复
lz这种类型的想得到啥结果
a123b456
是123456还是123.。。。
小宏 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lunzi028 的回复:]
SQL code--用函数来做createfunction[dbo].[F_Get_Number] (@Svarchar(100))returnsintASbeginwhilePATINDEX('%[^0-9]%',@S)>0beginset@s=stuff(@s,patindex('%[^0-9]%',@s),1,'')endreturncast(@Sasint)end
[/Quote]
呵呵写的很干净
soft_wsx 2009-09-14
  • 打赏
  • 举报
回复
来晚了!用patindex+函数
htl258_Tony 2009-09-14
  • 打赏
  • 举报
回复
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([col] NVARCHAR(10))
INSERT [tb]
SELECT 'asd123' UNION ALL
SELECT '123qwe' UNION ALL
SELECT 'asd' UNION ALL
SELECT 'qwe' UNION ALL
SELECT 'qw55e' UNION ALL
SELECT '111qwe122'
GO
--SELECT * FROM [tb]

-->SQL查询如下:

IF NOT object_id('FN_STR') IS NULL
DROP FUNCTION fn_str
GO
CREATE FUNCTION fn_str(@col NVARCHAR(50))
RETURNS INT
BEGIN
SET @col=RTRIM(LTRIM(@col))
IF PATINDEX('%[0-9]%',LEFT(@col,1))+PATINDEX('%[0-9]%',RIGHT(@col,1))=0
RETURN NULL
ELSE
BEGIN
SET @col=STUFF(@col,1,PATINDEX('%[0-9]%',@col)-1,'')+'a'
SET @col=LEFT(@col,PATINDEX('%[^0-9]%',@col)-1)
END
RETURN @col
END
GO

SELECT dbo.FN_STR(col) as a FROM tb
/*
a
-----------
123
123
NULL
NULL
NULL
111

(6 行受影响)
*/
修正。
SQL77 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 chuifengde 的回复:]
SQL codeDECLARE@aTABLE(aVARCHAR(200))INSERT@aSELECT'asd123'UNIONALLSELECT'123qwe'UNIONALLSELECT'asd'UNIONALLSELECT'qwe'SELECTCASEWHENPATINDEX('%[0-9]%',a)=1THENLEFT(a,PATINDEX('%[^0-9]%',a)-1)WHENPATI¡­
[/Quote]
学习,没循环也能有此效果??
skylineeeeee 2009-09-14
  • 打赏
  • 举报
回复
看来创建函数是个好方法,学习了.
chuifengde 2009-09-14
  • 打赏
  • 举报
回复
DECLARE @a TABLE(a VARCHAR(200))
INSERT @a SELECT 'asd123'
UNION ALL SELECT '123qwe'
UNION ALL SELECT 'asd'
UNION ALL SELECT 'qwe'

SELECT CASE WHEN PATINDEX('%[0-9]%',a)=1 THEN LEFT(a,PATINDEX('%[^0-9]%',a)-1)
WHEN PATINDEX('%[0-9]%',a)>1 THEN STUFF(a,1,PATINDEX('%[0-9]%',a)-1,'')
ELSE NULL
END a
FROM @a

--result
/*a
------------------------------
123
123
NULL
NULL

(所影响的行数为 4 行)
*/
htl258_Tony 2009-09-14
  • 打赏
  • 举报
回复

/*---------------------------------
-- Author : htl258(Tony)
-- Date : 2009-09-14 15:57:06
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
Mar 29 2009 10:27:29
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)

---------------------------------*/
--> 生成测试数据表:tb

IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([col] NVARCHAR(10))
INSERT [tb]
SELECT 'asd123' UNION ALL
SELECT '123qwe' UNION ALL
SELECT 'asd' UNION ALL
SELECT 'qwe'
GO
--SELECT * FROM [tb]

-->SQL查询如下:

IF NOT object_id('FN_STR') IS NULL
DROP FUNCTION fn_str
GO
CREATE FUNCTION fn_str(@col NVARCHAR(50))
RETURNS INT
BEGIN
IF PATINDEX('%[0-9]%',@col)=0
RETURN NULL
ELSE
BEGIN
SET @col=STUFF(@col,1,PATINDEX('%[0-9]%',@col)-1,'')+'a'
SET @col=LEFT(@col,PATINDEX('%[^0-9]%',@col)-1)
END
RETURN @col
END
GO

SELECT dbo.FN_STR(col) as a FROM tb
/*
a
-----------
123
123
NULL
NULL

(4 行受影响)
*/
加载更多回复(10)

34,590

社区成员

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

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