使用正则表达式在sql中获取varchar上的数字?
我有一个sql表,其中一列存储以下字符串:使用正则表达式在sql中获取varchar上的数字?,sql,sql-server,regex,Sql,Sql Server,Regex,我有一个sql表,其中一列存储以下字符串: CINTA NYLON CT708 DE 120MM X 1000MTRS CINTA NYLON 102MM X 1000MTRS 我想分别提取MM和MTRS之前的数字。 我的结果是: 120MM, 1000MTRS 102MM, 1000MTRS 这可能吗?不使用Regex,在大型数据集中可能非常昂贵,但考虑到您问题中的示例字符串,它是有效的 DECLARE @strings TABLE (string VARCHAR(100)); INSE
CINTA NYLON CT708 DE 120MM X 1000MTRS
CINTA NYLON 102MM X 1000MTRS
我想分别提取MM和MTRS之前的数字。
我的结果是:
120MM, 1000MTRS
102MM, 1000MTRS
这可能吗?不使用Regex,在大型数据集中可能非常昂贵,但考虑到您问题中的示例字符串,它是有效的
DECLARE @strings TABLE (string VARCHAR(100));
INSERT INTO @strings
VALUES ('CINTA NYLON CT708 DE 120MM X 1000MTRS'),
('CINTA NYLON 102MM X 1000MTRS');
SELECT string,
REVERSE(LEFT(REVERSE(SUBSTRING(string, 0, CHARINDEX('MM', string))), CHARINDEX(' ', REVERSE(SUBSTRING(string, 0, CHARINDEX('MM', string)))))) AS mm,
REVERSE(LEFT(REVERSE(SUBSTRING(string, 0, CHARINDEX('MTRS', string))), CHARINDEX(' ', REVERSE(SUBSTRING(string, 0, CHARINDEX('MTRS', string)))))) AS mtrs
FROM @strings;
不使用正则表达式,而且在大型数据集中可能非常昂贵,但考虑到您问题中的示例字符串,它是有效的
DECLARE @strings TABLE (string VARCHAR(100));
INSERT INTO @strings
VALUES ('CINTA NYLON CT708 DE 120MM X 1000MTRS'),
('CINTA NYLON 102MM X 1000MTRS');
SELECT string,
REVERSE(LEFT(REVERSE(SUBSTRING(string, 0, CHARINDEX('MM', string))), CHARINDEX(' ', REVERSE(SUBSTRING(string, 0, CHARINDEX('MM', string)))))) AS mm,
REVERSE(LEFT(REVERSE(SUBSTRING(string, 0, CHARINDEX('MTRS', string))), CHARINDEX(' ', REVERSE(SUBSTRING(string, 0, CHARINDEX('MTRS', string)))))) AS mtrs
FROM @strings;
据我所知,SQLServer2008R2没有实现RegExp。 我们也面临同样的问题,并使用Master Data Services功能修复了它。 我们现在有一个类似这样的函数:
CREATE FUNCTION [RegexExtract](@input [nvarchar](4000), @pattern [nvarchar](4000), @group [nvarchar](4000), @mask [tinyint])
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER, RETURNS NULL ON NULL INPUT
AS
EXTERNAL NAME [Microsoft.MasterDataServices.DataQuality].[Microsoft.MasterDataServices.DataQuality.SqlClr].[RegexExtract]
GO
按照此链接获取更多信息:据我所知,SQL Server 2008 R2没有实现RegExp。 我们也面临同样的问题,并使用Master Data Services功能修复了它。 我们现在有一个类似这样的函数:
CREATE FUNCTION [RegexExtract](@input [nvarchar](4000), @pattern [nvarchar](4000), @group [nvarchar](4000), @mask [tinyint])
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER, RETURNS NULL ON NULL INPUT
AS
EXTERNAL NAME [Microsoft.MasterDataServices.DataQuality].[Microsoft.MasterDataServices.DataQuality.SqlClr].[RegexExtract]
GO
按照此链接获取更多信息:使用:
有关更多信息,请参阅:
使用:
有关更多信息,请参阅:
使用table的一个版本:如果字符串上有索引,并且少于80个字符,那么SQL也可以猜测这种类似情况下的统计数据
declare @id varchar(max)
set @id=' '+'CINTA NYLON 102MM X 1000MTRS'+' '
;With cte
as
(
select
SUBSTRING(@id,n+1,charindex(' ',@id,n+1)-n-1) as string
from
numbers n
where
substring(@id,n,1)=' '
and n<len(@id)
)
select * from cte where string like '%mm%' or string like '%mtrs%'.
使用table的一个版本:如果您的字符串上有一个索引,并且少于80个字符,那么SQL也可以猜测这种类似条件下的统计数据
declare @id varchar(max)
set @id=' '+'CINTA NYLON 102MM X 1000MTRS'+' '
;With cte
as
(
select
SUBSTRING(@id,n+1,charindex(' ',@id,n+1)-n-1) as string
from
numbers n
where
substring(@id,n,1)=' '
and n<len(@id)
)
select * from cte where string like '%mm%' or string like '%mtrs%'.
你能标记你正在使用的数据库管理系统吗?Sql Server 2008 R2在Javascript中是这样的:CINTA尼龙CT708 DE 120MM X 1000MTRS.match/\d*MM |\d*MTRS/giDo你知道如何操作吗?也可能有用。你能给我一个应用于所附数据的示例吗?你能标记你正在使用的dbms吗?Sql Server 2008 R2在Javascript中是这样的:CINTA尼龙CT708 DE 120MM X 1000MTRS.match/\d*MM |\d*MTRS/giDo你知道如何操作吗?可能也有用。你能给我一个应用于所附数据的示例吗?非常感谢,这正是我所需要的。非常感谢,这正是我所需要的。