LIKE模式T-SQL

时间:2015-07-09 13:00:05

标签: sql-server tsql sql-server-2012 sql-like

我写了一个措辞,将一个很长的字符串写成小块,在完成一个项目的措辞后,它将它从@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

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

尝试将匹配变量/条件更改为:

SET @match  =  '%[1-9][a-z]%[/][a-z]%'

这将为您提供所需的结果。松散地翻译它是说“给我第一场比赛的起始位置,模式是[任何] - [数字从1-9] - [单个字母从az] - [任何] - [斜线] - [单个来自AZ] - [什么]
。 希望这有帮助!

答案 1 :(得分:0)

我同意上述评论;这是一个需要使用正则表达式工具解决的正则表达式问题。我建议使用SimpleTalk创建的程序集。 You can get their code and read their very thorough article

不幸的是,此解决方案需要对数据库和服务器具有严格的管理权限,因此它不能作为脚本移植。但是,如果您定期在同一个数据库上进行开发,我认为这些函数值得花费任何精力。

只是转发,正则表达式是一个真正的处理猪并破坏SQL Server中的大部分索引效率。只有当你不能使用时才使用它。

答案 2 :(得分:0)

我不知道这是否能解决您的整个问题,但如果您可以在输入前添加空格,则可以修改模式以避免匹配没有前面空格的数字。

set @input = ' '+@input;
set @match = '% [1-9][a-z]%';

如果你需要你的模式来考虑其他空白,如Cr和Lf,你的模式可能如下所示:

set @match = '%[ '+char(13)+char(10)+'][1-9][a-z]%';