MSSQL正则表达式

MSSQL Regular expression

提问人:Clare Barrington 提问时间:3/23/2015 最后编辑:eggyalClare Barrington 更新时间:11/3/2021 访问量:172371

问:

我有以下正则表达式:^[-A-Za-z0-9/.]+$

当前,这将检查输入到文本框中的值是否与此值匹配。否则,它将引发错误。

我需要检查数据库中是否有任何与此不匹配的内容。

我累了:

 SELECT * FROM *table* WHERE ([url] NOT LIKE '^[-A-Za-z0-9/.]+$') 
 SELECT * FROM *table* WHERE PATINDEX ('^[-A-Za-z0-9/.]+$', [url])

更新

因此,经过一番研究,我意识到我认为我不能使用 REGEXP。

我以为我能做这样的事情吗?它没有给我预期的结果,但它的运行方式与其他任何东西都不同。谁能发现它有什么问题?

SELECT *, 
  CASE WHEN [url] LIKE '^[-A-Za-z0-9/.]+$' 
    THEN 'Match' 
    ELSE 'No Match' 
  END Validates
FROM 
  *table*
sql-server 正则表达式

评论

2赞 eggyal 3/23/2015
您使用的是MSSQL还是MySQL?它们是来自不同供应商的两种不同的竞争性 RDBMS 产品,并且具有不同的语法。

答:

21赞 Lucas Trzesniewski 3/23/2015 #1

免責聲明:最初的问题是关于MySQL的。SQL Server 的答案如下。

MySQL数据库

在MySQL中,正则表达式语法如下:

SELECT * FROM YourTable WHERE (`url` NOT REGEXP '^[-A-Za-z0-9/.]+$') 

使用子句代替 .后者用于使用 和 通配符进行模式匹配。REGEXPLIKE%_


SQL 服务器

由于您输入了拼写错误,并且使用的是 SQL Server(而不是 MySQL),因此必须创建用户定义的 CLR 函数来公开正则表达式功能。

有关更多详细信息,请查看此文章

评论

0赞 Clare Barrington 3/23/2015
我收到“在预期条件的上下文中指定的非布尔类型的表达式”,我是否需要引用其他任何内容?
0赞 Lucas Trzesniewski 3/23/2015
嗯,我想这可能和系统发育的评论有关......不要用于转义列名称,这是 T-SQL 语法。如果可能的话,要么删除它们,要么使用反引号 (')[...]
0赞 Clare Barrington 3/23/2015
我已经将其更改为上面的代码。我现在收到:'REGEX'附近的语法不正确。期望介于 in 或 like 之间。我已经用谷歌搜索了一下,似乎这是一个类型转换错误?
0赞 Clare Barrington 3/23/2015
我开始怀疑我是否可以在 SQL Management Studio 2012 中实际使用 REGEXP
1赞 Lucas Trzesniewski 3/23/2015
@Clare啊!是的,这是完全不同的事情!在MSSQL中,您需要使用CLR函数来使用正则表达式。
-2赞 Matt 3/23/2015 #2

如上所述,问题最初是关于MySQL的

使用 ,而不是 :REGEXPLIKE

SELECT * FROM `table` WHERE ([url] NOT REGEXP '^[-A-Za-z0-9/.]+$')

评论

1赞 Matt 2/5/2018
@Azimuth 有关 SQL Server 的正则表达式信息可在此处找到 learn.microsoft.com/en-us/sql/relational-databases/scripting/...
1赞 bjauy 2/8/2018
@Matt 您提供的链接是指编辑查询,而不是 SQL Server 的有效语法。更重要的是,即使在 SQL Server 2017 中运行类似的查询也会返回错误 - 我假设还没有这样的关键字。An expression of non-boolean type specified in a context where a condition is expected, near 'REGEXP'.
0赞 Azimuth 2/15/2018
是的,正如@bjauy指出的那样,没有这样的关键字。因此,请使用正确的 SQL 代码更新您的答案。REGEXP
29赞 Clare Barrington 3/23/2015 #3

这是我最后用到的:

SELECT *, 
  CASE WHEN [url] NOT LIKE '%[^-A-Za-z0-9/.+$]%' 
    THEN 'Valid' 
    ELSE 'No valid' 
  END [Validate]
FROM 
  *table*
  ORDER BY [Validate]

评论

10赞 Mr. Napik 5/17/2016
我非常确定答案不会按预期工作,因为 MS-SQL 仅支持非常有限的 RegExp 子集,例如运算符:msdn.microsoft.com/en-us/library/ms187489(v=sql.105).aspx,因此 [] 中提供的表达式匹配集合 ^-A-Za-z0-9/.+$ 中的一个字符,其余的由 % 使用,它将匹配 LIKE 表达式中的任何字符串。
1赞 Martin Smith 10/24/2016
@Mr.Napik - 这个想法是合理的,尽管它取决于排序规则,但它是否真的像写的那样工作。 充当否定。因此,与其说“检查每个字符是否与模式匹配”,不如检查没有与模式不匹配的字符。不过,它可能需要一个二进制 collate 子句才能真正按预期工作。例如,看有和没有它。^SELECT char(number) FROM master..spt_values WHERE type='P' and number between 1 and 255 and CHAR(number) NOT LIKE '[^-A-Za-z0-9/.+$]' COLLATE Latin1_General_Bin