LIKE模式T-SQL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LIKE模式T-SQL相关的知识,希望对你有一定的参考价值。
我已经写了一个措辞,将一个很长的字符串写成小块,在完成一个项目的措辞之后,它将它从@input中移除并继续,直到它找不到任何项目的短语。我正在根据LIKE模式选择项目。
在某些情况下,它会选择消息的其他部分,然后以不定式循环结束。
我希望使用LIKE子句选择的模式格式为:
(1至9的任何数字)+(仅可变长度A-Z)+'/'+(仅可变长度A-Z)+ Cr或Lf或CrLf的空间。
--This is what I do have:
DECLARE @match NVarChar(100)
SET @match = '%[1-9][a-z]%'
DECLARE @input1 varchar(max),@input2 varchar(max)
SET @input1 ='1ABCD/EFGH *W/17001588 *RHELLO SMVML1C'
DECLARE @position Int
SET @position = PATINDEX(@match, @input1);
SELECT @position;
--after the loop- it is also 'catching' the 1C at the end of the string:
SET @input2 = '*W/17001588 *RHELLO SMVML1C'
SET @position = PATINDEX(@match, @input2);
SELECT @position
---In order to eliminate this, I have tried to change @match:
SET @match = '%[1-9][a-z][/][a-z]%'
SET @position = PATINDEX(@match, @input1);
SELECT @position --postion is 0, so the first item, that should have been selected, wasn't selected
SET @position = PATINDEX(@match, @input2);
SELECT @position --postion is 0
非常感谢您的帮助!
尝试将匹配变量/条件更改为:
SET @match = '%[1-9][a-z]%[/][a-z]%'
这将为您提供所需的结果。松散地翻译它是说“给我第一场比赛的起始位置,模式是[任何] - [数字从1-9] - [单个字母从az] - [任何] - [斜线] - [单个来自AZ] - [什么。 希望这可以帮助!
我同意上述评论;这是一个需要使用正则表达式工具解决的正则表达式问题。我建议使用SimpleTalk创建的程序集。 You can get their code and read their very thorough article。
不幸的是,此解决方案需要对数据库和服务器具有严格的管理权限,因此它不能作为脚本移植。但是,如果您定期在同一个数据库上进行开发,我认为这些功能是值得的。
只是转发,正则表达式是一个真正的处理猪并破坏SQL Server中的大部分索引效率。只有在不能使用时才使用它。
我不知道这是否能解决您的整个问题,但如果您可以在输入前添加空格,则可以修改模式以避免匹配没有前面空格的数字。
set @input = ' '+@input;
set @match = '% [1-9][a-z]%';
如果你需要你的模式来考虑其他像Cr和Lf这样的空格,你的模式可能如下所示:
set @match = '%[ '+char(13)+char(10)+'][1-9][a-z]%';
以上是关于LIKE模式T-SQL的主要内容,如果未能解决你的问题,请参考以下文章
与 T-sql 的 LIKE 命令等效的天蓝色表存储查询是啥?
T-SQL 转义select …. like中的特殊字符(百分号)