Sql PATINDEX的简单解释

Sql PATINDEX的简单解释,sql,sql-server,tsql,syntax,Sql,Sql Server,Tsql,Syntax,我一直在阅读关于PATINDEX的文章,试图了解什么和为什么。我理解,当使用通配符时,它将返回一个INT,表示该字符出现/开始的位置。因此: SELECT PATINDEX('%b%', '123b') -- returns 4 然而,我想看看是否有人可以解释为什么你会用一种简单的方式使用它的原因。我读过其他一些论坛,但老实说,它并没有深入。除了返回模式的位置而不是单个字符外,它大致相当于。示例: 检查字符串是否至少包含一个数字: 选择PATINDEX“%[0-9]”,“Hello'-0” 选

我一直在阅读关于PATINDEX的文章,试图了解什么和为什么。我理解,当使用通配符时,它将返回一个INT,表示该字符出现/开始的位置。因此:

SELECT PATINDEX('%b%', '123b') -- returns 4
然而,我想看看是否有人可以解释为什么你会用一种简单的方式使用它的原因。我读过其他一些论坛,但老实说,它并没有深入。除了返回模式的位置而不是单个字符外,它大致相当于。示例:

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

选择PATINDEX“%[0-9]”,“Hello'-0” 选择PATINDEX“%[0-9]”,“H3110'-2” 从字符串中提取数字部分:

选择子字符串“12345”,PATINDEX“%[0-9]”,“12345”,100-12345 选择子字符串“x2345”,PATINDEX“%[0-9]”,“x2345”,100-2345 选择子字符串“xx345”,PATINDEX“%[0-9]”,“xx345”,100-345 引自

以下示例使用%和uu通配符查找位置 其中模式“en”,后跟任意一个字符和“ure”开始 在指定的字符串中,索引从1开始:

这是结果集


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

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

我必须导入一个文本文件并对其进行解析,以便稍后插入。但这些文件有时有这种格式的数字:00000-59。如果尝试将“00000-59”强制转换为INT,则会出现错误。所以我需要的代码可以解析00000-59到-59,也可以解析00000-159到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]在本例中表示不是0的任何字符。所以PATINDEX告诉我0的结束时间,不管是因为-还是数字

我遇到的第二个用例是检查一个数字是否正确。为此,需要将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

同样,我并不关心如何准确地找到字母A或B等。我只是找到任何不是数字的东西并将其转换。

它有很多用途,通常与其他函数结合使用。您可以使用Patindex“%[0-9]%”、string、Stuff和while子句的组合来帮助从字符串中剥离数字。使用它有很多原因,当您遇到一个需要使用它来解决问题的问题时,您可能会更好地理解它。例如,您希望从某个字符出现的位置剪切字符串。请选择LEFT'123x45',PATINDEX'%x%,“123x45”-1您将x的位置传递给左函数,以便它知道在哪里剪切感谢您的评论,这有助于我了解PATINDEX函数的工作原理。克里斯蒂安·巴伦,谢谢你的解释,这有助于我阅读和理解我目前正在看的剧本。非常感谢你的解释,这已经澄清了问题。具有讽刺意味的是,我一直在看的一些脚本一直在使用子字符串,所以这对我帮助很大。再次感谢萨尔曼。感谢你分享这个例子,它帮助了我的理解。我相信这可能是我已经读过的例子之一。谢谢你,乔德尔:。哇。。。。。。非常感谢。这对我来说真的很清楚。我将偷取这个答案并保存下来以备将来参考。再次感谢各位:
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)
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