PATINDEX检测字母和六个数字

时间:2018-11-30 15:57:39

标签: sql tsql sql-server-2012

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

这个数字总是得到六种算法。

5 个答案:

答案 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

使图案或多或少地针对口味。