T-SQL中的正则表达式

T-SQL中的正则表达式,sql,sql-server,regex,Sql,Sql Server,Regex,我有下一个问题,有一个表与列数据(类型-nvarchar),这列可以包含任何字符,我只需要选择的数据是数字或数字范围,但忽略空格。例如: declare @tmp table (data nvarchar(192), Result nvarchar(192)); insert into @tmp SELECT '123', '<- valid'; insert into @tmp SELECT ' 123 ', '<- valid'; insert into @tmp SELECT

我有下一个问题,有一个表与列数据(类型-nvarchar),这列可以包含任何字符,我只需要选择的数据是数字或数字范围,但忽略空格。例如:

declare @tmp table (data nvarchar(192), Result nvarchar(192));

insert into @tmp SELECT '123', '<- valid';
insert into @tmp SELECT ' 123 ', '<- valid';
insert into @tmp SELECT '123-123', '<- valid';
insert into @tmp SELECT ' 123 - 123 ', '<- valid';
insert into @tmp SELECT '123jmj', '<- invalid';
insert into @tmp SELECT '123,5441', '<- invalid';
insert into @tmp SELECT '123,yjyj', '<- invalid';

SELECT * FROM @tmp

但是我只得到了第一行。

首先将
空格
替换为
空字符串

接下来将
-
替换为

第三,使用技巧分离数据

分离后,您可以使用
而不是“[^0-9]”来筛选记录。

SELECT data
FROM   (SELECT *,
               Parsename(Replace(Replace(data, ' ', ''), '-', '.'), 2) st,
               Parsename(Replace(Replace(data, ' ', ''), '-', '.'), 1) ed
        FROM   @tmp) a
WHERE  st NOT LIKE '%[^0-9]%'
        OR ed NOT LIKE '%[^0-9]%' 

由于您可以看到的类似Regex的功能非常有限,那么有哪些替代方案呢?早期版本(2005+)具有
ISNUMERIC()
功能,而较新版本(2012+)可以使用
TRY_PARSE()
。您可以
LTRIM(RTRIM(data))
,这也将给出第二行。对于必须在
中添加
条件的范围
,这应该不会太难,但您可能必须
替换值中的空格。@Bridge,
是数值的
非常不可靠,货币符号和算术符号的计算结果也是真的
TRY_PARSE
对范围无效。@Honeybacker是对的-你需要自己处理数字的范围,我错过了这个要求!目前,正则表达式解决方案也不能处理这一问题:)t-SQL根本不支持正则表达式——这些是通配符,而不是正则表达式。如果性能可以接受(应该可以,因为像这样的
like
不会使用索引),并且如果可以首先启用SQL CLR:),则可以使用SQL CLR来使用.NETs
Regex
类。这至少适用于示例数据。您可以稍微扩展一下它的工作原理吗?Parsename仅用于sql+2012@JuanCarlosOropeza-请参考该链接。它从
2005
@MM93开始工作。您的链接说
适用于:SQL Server(SQL Server 2012到当前版本),
@JuanCarlosOropeza不,它只是SQL Server 2014的版本。您需要选择不同版本的SQL server—这是2005版本。
SELECT data
FROM   (SELECT *,
               Parsename(Replace(Replace(data, ' ', ''), '-', '.'), 2) st,
               Parsename(Replace(Replace(data, ' ', ''), '-', '.'), 1) ed
        FROM   @tmp) a
WHERE  st NOT LIKE '%[^0-9]%'
        OR ed NOT LIKE '%[^0-9]%'