【问题标题】:Simple Explanation for PATINDEXPATINDEX 的简单说明
【发布时间】:2015-02-10 10:44:03
【问题描述】:

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

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

但是,我正在寻找是否有人可以解释您为什么会以简单(ish)的方式使用它的原因。我已经阅读了其他一些论坛,但说实话并没有深入了解。

【问题讨论】:

  • 用途很多,一般与其他功能结合使用。您可以使用 Patindex('%[0-9]%', string)、Stuff 和 while 子句的组合来帮助从字符串中去除数字。使用它有很多理由,当您遇到需要使用它来解决的问题时,也许您会更好地理解它
  • 假设您想从某个字符出现的位置剪切一个字符串。SELECT LEFT('123x45',PATINDEX('%x%','123x45')-1) 您将 x 所在的位置传递给 LEFT 函数,以便它知道“剪切”的位置
  • 感谢 cmets,它帮助我理解了 PATINDEX 函数是如何工作的 Mihai。克里斯蒂安·巴伦(Christian Barron),感谢您的解释,这有助于我阅读和理解我目前正在看的剧本。

标签: sql sql-server tsql syntax


【解决方案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] 在这种情况下表示“任何不是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 等。我只是找到任何不是数字的东西并将其转换。

【讨论】:

  • 哇......非常感谢。这对我来说真的很清楚。我将窃取此答案并将其保存以供将来参考。再次感谢你:)
【解决方案2】:

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

【讨论】:

  • 非常感谢您的解释,这已经解决了问题。具有讽刺意味的是,我一直在看的那段脚本一直在使用 SUBSTRING,所以这对我有很大帮助。再次感谢萨尔曼。
【解决方案3】:

引自PATINDEX (Transact-SQL)

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

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

这是结果集。

8

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

【讨论】:

  • 感谢您分享这个例子,它帮助了我的理解。我相信这可能是我已经读过的例子之一。谢谢 Jodrell :)。
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2018-01-27
  • 2015-03-16
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多