SQL 服务器:从字符串中提取 $#,###

SQL Server: extracting $#,### from a string

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

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

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

INSERT INTO #TMP
VALUES ('I have ,000'),
       (',450is what I have'),
       ('this 0 is what I have now'),
       (' cause I am broke'),
       ('I have ,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

结果:

SQL 服务器版本:

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

嗨,我认为这个解决方案可行:

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

INSERT INTO #TMP
VALUES
     ('I have ,000')
    ,(',450is what I have')
    ,('this 0 is what I have now')
    ,(' cause I am broke')
    ,('I have ,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 函数也是如此 return0。

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

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

其他 post :

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

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