SQL Server:从字符串中提取$#,###

时间:2019-03-15 13:59:12

标签: sql-server regex substring sql-server-2016 patindex

我正在尝试使用子字符串,charindexes和patindexes的混合从字符串中提取美元值。我似乎可以从所有字符串中提取$###,###模式,除非它落在字符串的末尾。

以下是一些带有测试用例的代码:

CREATE TABLE #TMP 
(
    string VARCHAR(50)
)
GO

INSERT INTO #TMP
VALUES ('I have $4,000'),
       ('$44,450is what I have'),
       ('this $600 is what I have now'),
       ('$5 cause I am broke'),
       ('I have $10,000,000,000 '),
       ('No Money Here')
GO

SELECT 
    *,
    SUBSTRING(string, 
              CHARINDEX('$', string), 
              PATINDEX('%[^0-9,]%', SUBSTRING(string, CHARINDEX('$', string) + 1, 80000))) AS Result
FROM 
    #TMP

DROP TABLE #TMP
GO

结果:

enter image description here

SQL Server版本:

Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64)

2 个答案:

答案 0 :(得分:3)

只需在每个string实例中添加一个x(或任何非数字字符):

SELECT 
    *,
    SUBSTRING(
        string + 'x', 
        CHARINDEX('$',string + 'x'), 
        PATINDEX('%[^0-9,]%',SUBSTRING(string + 'x',CHARINDEX('$',string + 'x')+1, 80000))
    ) AS Result
FROM 
    #TMP

答案 1 :(得分:1)

您好,我认为此解决方案可行:

CREATE TABLE #TMP (
    string varchar(50)
)
GO

INSERT INTO #TMP
VALUES
     ('I have $4,000')
    ,('$44,450is what I have')
    ,('this $600 is what I have now')
    ,('$5 cause I am broke')
    ,('I have $10,000,000,000')
    ,('No Money Here')
GO

SELECT 
    *,
    PATINDEX('%[^0-9,]%',SUBSTRING(string,CHARINDEX('$',string)+1, LEN(string))),
    SUBSTRING(
        string, 
        CHARINDEX('$',string), 
        CASE WHEN PATINDEX('%[^0-9,]%',SUBSTRING(string,CHARINDEX('$',string)+1, LEN(string))) = 0  THEN  LEN(string) -1 ELSE PATINDEX('%[^0-9,]%',SUBSTRING(string,CHARINDEX('$',string)+1, LEN(string))) END
    ) AS Result
FROM 
    #TMP

DROP TABLE 
  #TMP
GO

如果模式在字符串末尾,PATINDEX函数也应返回0。

但是,如果您在1个字符串中收到多个金额,我不知道您会找到什么 像:helo我现在有20美元,但昨天我有100美元

有关更多信息:https://docs.microsoft.com/en-us/sql/t-sql/functions/patindex-transact-sql?view=sql-server-2017

其他帖子:PATINDEX returning 0 on matching rexpresson

相关问题