Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用正则表达式在sql中获取varchar上的数字?_Sql_Sql Server_Regex - Fatal编程技术网

使用正则表达式在sql中获取varchar上的数字?

使用正则表达式在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

我有一个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));

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你知道如何操作吗?可能也有用。你能给我一个应用于所附数据的示例吗?非常感谢,这正是我所需要的。非常感谢,这正是我所需要的。