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中的特殊字符(百分号)

在 T-SQl 中使用 like 搜索由未知数量的空格分隔的单词

在T-SQL中使用LIKE与存储过程完全匹配?

在T-SQL中具有可变数量的搜索条件的LIKE运算符

T-SQL - 如何在LIKE子句中转义斜杠/方括号