我一直在阅读PATINDEX,试图了解什么和为什么。我理解当使用通配符时,它将返回一个INT,说明该字符出现/启动的位置。所以:
SELECT PATINDEX('%b%', '123b') -- returns 4然而,我想看看是否有人能解释为什么你会用一种简单的(Ish)方式来使用它。我读过其他一些论坛,但老实说,它并没有沉入其中。
发布于 2015-02-10 11:53:09
你要求的是实际的用例吗?我可以想到两个真实的用例,在我的工作中,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]的意思是“不是a0__的任何字符”。所以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等等。我只是找到任何不是数字的东西,并转换它。
发布于 2015-02-10 11:08:03
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发布于 2015-02-10 11:17:20
下面的示例使用
%和_通配符查找模式'en'的位置,后面跟着任何一个字符,'ure'在指定的字符串中开始(索引从1开始):
SELECT PATINDEX('%en_ure%', 'please ensure the door is locked');这是结果集。
8当您想知道模式以有效文本或字符数据类型的表达式开始于哪个字符位置时,可以使用PATINDEX函数。
https://stackoverflow.com/questions/28429670
复制相似问题