【问题标题】:SQL Server: extracting $#,### from a stringSQL Server:从字符串中提取 $#,###
【发布时间】:2019-08-06 15:11:01
【问题描述】:

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

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

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

结果:

SQL Server 版本:

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

【问题讨论】:

  • 我使用的是 Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 版本
  • 你好,我不工作,因为你的 4.000 美元在最后,我认为这是寻找的方式

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


【解决方案1】:

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

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

【讨论】:

  • 简单。什么会更有效率? case 语句或添加 x?
  • 我觉得使用LEN() 的性能会更差,但可能不会以任何人类可测量的方式。
【解决方案2】:

嗨,我认为这个解决方案可以工作:

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 个字符串中收到多个金额,我不知道您会发现什么 like : 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

【讨论】:

  • 这行得通。我本来可以更清楚地了解我的限制——这些行中只有一美元。谢谢!
猜你喜欢
  • 2021-11-22
  • 2016-11-24
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2021-07-03
  • 2017-12-10
  • 1970-01-01
相关资源
最近更新 更多