PATINDEX的简单说明

时间:2015-02-10 10:44:04

标签: sql sql-server tsql syntax

我一直在读PATINDEX试图了解什么和为什么。我理解当使用通配符时,它将返回一个INT,指出该字符出现/开始的位置。所以:

SELECT PATINDEX('%b%', '123b') -- returns 4

但是,我想看看是否有人可以解释为什么你会以简单(ish)的方式使用它的原因。我已经阅读了其他一些论坛,但这并不是说实话。

3 个答案:

答案 0 :(得分:1)

PATINDEX大致相当于CHARINDEX,除了它返回模式的位置而不是单个字符。例子:

检查字符串是否包含至少一个数字:

SELECT PATINDEX('%[0-9]%', 'Hello') -- 0
SELECT PATINDEX('%[0-9]%', 'H3110') -- 2

从字符串中提取数字部分:

SELECT SUBSTRING('12345', PATINDEX('%[0-9]%', '12345'), 100) -- 12345
SELECT SUBSTRING('x2345', PATINDEX('%[0-9]%', 'x2345'), 100) -- 2345
SELECT SUBSTRING('xx345', PATINDEX('%[0-9]%', 'xx345'), 100) -- 345

答案 1 :(得分:1)

引自PATINDEX (Transact-SQL)

  

以下示例使用%_通配符来查找位置   模式'en',后跟任何一个字符和'ure'开始   在指定的字符串中(索引从1开始):

SELECT PATINDEX('%en_ure%', 'please ensure the door is locked');
  

这是结果集。

8

当您想知道模式在有效文本或字符数据类型的表达式中的起始位置时,您可以使用PATINDEX函数。

答案 2 :(得分:1)

您是否要求实际使用案例?我可以想到我工作过的两个真实的用例,其中PATINDEX()是我最好的选择。

我必须导入一个文本文件,稍后再解析它为INSERT INTO。但是这些文件有时会以这种格式编号:00000-59。如果您尝试CAST('00000-59' AS INT),则会收到错误消息。所以我需要的代码可以解析00000-59-59,还需要00000159159等。-可能在任何地方,或者它可能根本就不存在一点都不这就是我所做的:

DECLARE @my_var VARCHAR(255) = '00000-59', @my_int INT

SET @my_var = STUFF(@my_var, 1, PATINDEX('%[^0]%', @my_var)-1, '')
SET @my_int = CAST(@my_var AS INT)
在这种情况下,

[^0]表示 a 0的任何字符。所以PATINDEX()告诉我0结束的时间,不管是因为-还是数字。

我遇到的第二个用例是检查IBAN号码是否正确。为此,需要将IBAN中的任何字母更改为相应的数字(A = 10,B = 11等)。我做了这样的事情(不完整但你明白了):

SET @i = PATINDEX('%[^0-9]%', @IBAN)
WHILE @i <> 0 BEGIN
  SET @num = UNICODE(SUBSTRING(@IBAN, @i, 1))-55
  SET @IBAN = STUFF(@IBAN, @i, 1, CAST(@num AS VARCHAR(2))
  SET @i = PATINDEX('%[^0-9]%', @IBAN)
END

所以,我并不关心找到完整的字母AB等等。我只是发现任何不是数字并转换它的东西。