PATINDEX 的简单说明

Simple Explanation for PATINDEX

我一直在阅读有关 PATINDEX 的文章,试图了解是什么以及为什么。我理解在使用通配符时,它会 return 一个关于该字符 appears/starts 位置的 INT。所以:

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

但是我想看看是否有人可以解释为什么您会以一种简单的方式使用它。我已经阅读了其他一些论坛,但老实说,我并没有完全融入其中。

PATINDEX is roughly equivalent to CHARINDEX 除了它 returns 模式的位置而不是单个字符。示例:

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

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

引自PATINDEX (Transact-SQL)

The following example uses % and _ wildcards to find the position at which the pattern 'en', followed by any one character and 'ure' starts in the specified string (index starts at 1):

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

Here is the result set.

8

如果您想知道在有效文本或字符数据类型的表达式中模式从哪个字符位置开始,您可以使用 PATINDEX 函数。

您要的是实际用例吗?我可以想到我在工作中遇到的两个真实用例,其中 PATINDEX() 是我的最佳选择。

我不得不导入一个文本文件并稍后为 INSERT INTO 解析它。但是这些文件有时会有这种格式的数字:00000-59。如果你尝试 CAST('00000-59' AS INT) 你会得到一个错误。所以我需要的代码可以将 00000-59 解析为 -59,还可以将 00000159 解析为 159 等。- 可以在任何地方,也可以根本不存在根本。这就是我所做的:

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] 在这种情况下表示 "any character that isn't 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 等。我只是找到任何不是数字的东西并转换它。