SQL Server 2012。
表a
Id name number
1 py/ut/455656/ip null
2 py/ut/jl/op null
3 py/utr//grt null
我要检索数字
Id name number
1 py/ut/455656/ip 455656
2 py/ut/jl/op null
3 py/utr//grt null
此处是sql脚本
update table a
set number=SUBSTRING(name,PATINDEX('py/u/[0-9]',name)+6,6)
我需要检索py/ut
之后和/
之前的数字。如果有数字,该脚本将运行良好。对于第二行,它正在交付jl/op
这个数字总是得到六种算法。
答案 0 :(得分:2)
检查此:
declare @Number nvarchar(20)='py/ut/455656/ip'
Declare @intAlpha int
SET @intAlpha = PATINDEX('%[^0-9]%', @Number )
BEGIN
WHILE @intAlpha > 0
BEGIN
SET @Number = STUFF(@Number , @intAlpha, 1, '' )
SET @intAlpha = PATINDEX('%[^0-9]%', @Number )
END
END
select @Number
答案 1 :(得分:1)
如果名称字段仅包含一个数字,则此脚本应为您工作: 我做了什么:
PATINDEX()
来查找数字的起始点。 PATINDEX()
名称和REVERSE()
来查找终点。LEN()
来查找字段的总长度。SUBSTRING()
来捕获从起点到总长度的数字-(起点)-(终点)。检查:
--DROP TABLE #A
--GO
CREATE TABLE #A
(
id int
,name VARCHAR(100)
);
INSERT INTO #A
VALUES (1, 'py/ut/455656/ip')
, (2, 'py/ut/jl/op ')
, (3, 'py/utr//grt ')
SELECT
id
,name
/*
,PATINDEX('%[0-9]%', name) - 1 --starting poing
,PATINDEX('%[0-9]%', REVERSE(name)) - 1 --reverse starting point
*/
,CASE WHEN (PATINDEX('%[0-9]%', name) - 1)>0
THEN SUBSTRING(name
,PATINDEX('%[0-9]%', name),
LEN(NAME) - (PATINDEX('%[0-9]%', name) - 1) - (PATINDEX('%[0-9]%', REVERSE(name)) - 1)
)
ELSE null END Number
FROM #A
答案 2 :(得分:1)
只需添加一个where
子句:
update table a
set number = SUBSTRING(name, PATINDEX('py/u/[0-9]', name) + 6, 6)
where name like '%py/u/[0-9]%'
答案 3 :(得分:1)
PATINDEX的工作方式类似于LIKE运算符,因此您所使用的模式实际上在两行中均返回0,并且恰好适用于从py / ut /部分开始具有6个数字的值。您需要在传递给PATINDEX的模式中添加通配符,并在UPDATE语句中添加WHERE子句。
尝试这样的事情:
-- Length of the path prefix, assumes it is constant
DECLARE @lenPrefix int
set @lenPrefix = 6
DECLARE @lenNumber int
SET @lenNumber = 6
UPDATE TABLE a
SET number=SUBSTRING(name, PATINDEX('py/ut/[0-9]%', name) + @lenPrefix, @lenNumber)
WHERE
PATINDEX('py/ut/[0-9]%', name) > 0
答案 4 :(得分:1)
DECLARE @a TABLE([name] NVARCHAR(MAX), number INT NULL)
INSERT @a([name]) VALUES ('py/ut/455656/ip'), ('py/ut/jl/op'), ('py/utr//grt')
UPDATE @a
SET number = SUBSTRING([name], PATINDEX('%/[0-9][0-9][0-9][0-9][0-9][0-9]/%', [name]) + 1, 6)
WHERE [name] LIKE '%/[0-9][0-9][0-9][0-9][0-9][0-9]/%'
SELECT * FROM @a
使图案或多或少地针对口味。