提问人:Clare Barrington 提问时间:3/23/2015 最后编辑:eggyalClare Barrington 更新时间:11/3/2021 访问量:172371
MSSQL正则表达式
MSSQL Regular expression
问:
我有以下正则表达式:^[-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*
答:
21赞
Lucas Trzesniewski
3/23/2015
#1
免責聲明:最初的问题是关于MySQL的。SQL Server 的答案如下。
MySQL数据库
在MySQL中,正则表达式语法如下:
SELECT * FROM YourTable WHERE (`url` NOT REGEXP '^[-A-Za-z0-9/.]+$')
使用子句代替 .后者用于使用 和 通配符进行模式匹配。REGEXP
LIKE
%
_
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的
使用 ,而不是 :REGEXP
LIKE
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
评论