sql server select语句中的正则表达式
我在表sql server select语句中的正则表达式,sql,sql-server,Sql,Sql Server,我在表transaction中有一列名为external ref 以一行为例 其交易代码:1188716其批次:7860615/16 1188716是trans编号 78606是批次id 15/16是日期 我只对trans和batch id感兴趣 我最初是这样做的 SELECT SUBSTRING(ts.ext_ref, 17, 7) AS transaction_id, SUBSTRING(ts.ext_ref, 34, 7) batch_id FROM transac
transaction
中有一列名为external ref
以一行为例
其交易代码:1188716其批次:7860615/16
- 1188716是trans编号
- 78606是批次id
- 15/16是日期
SELECT
SUBSTRING(ts.ext_ref, 17, 7) AS transaction_id,
SUBSTRING(ts.ext_ref, 34, 7) batch_id
FROM transactions ts
它停止工作,因为1188716和78606都不是固定长度
我可以获得事务id 123批处理id 456
或事务id 12345566批处理id 45678990
我想实现如下逻辑
在第3和第4个空格之间对任意连续数字进行配对
在第6和第7个空格上也有同样的逻辑
有可能在SQL server中实现这一点吗?这有点像黑客,只有当您接收到该格式的数据时,这才有效
DECLARE @text VARCHAR(MAX) = 'ITS trans code: 1188716 ITS batch: 78606 15/16'
SELECT LEFT(LTRIM(RTRIM(REPLACE(@text, LEFT(@Text, CHARINDEX(':', @text)), ''))), CHARINDEX(' ',LTRIM(RTRIM(REPLACE(@text, LEFT(@text, CHARINDEX(':', @text)), ''))))) As TransNumber,
REVERSE(LEFT(REPLACE(REVERSE(@text), LEFT(REVERSE(@text), CHARINDEX(' ',REVERSE(@text))), ''),CHARINDEX(' ',REPLACE(REVERSE(@text), LEFT(REVERSE(@text), CHARINDEX(' ', REVERSE(@text))), '')))) AS BatchID
我们也面临同样的问题,并使用Master Data Services功能修复了它。我们确实需要SqlServer上的RegExp,最终得到了如下函数:
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
按照此链接获取更多信息:使用CHARINDEX()和SUBSTRING()可能重复事实上,使用CHARINDEX()SUBSTRING()REVERSE()LTRIM()REPLACE()函数是解决此问题的关键。抱歉。你要做的就是把它倒回去。我做了更新,如果可以的话我会投票。。这是一个很好的解决方案。但就我而言,这是一个一次性的查询。姆维瑟的回答更适合我