SQL Server: извлечение $ #, ### из строки - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь извлечь долларовое значение из строки, используя смесь подстрок, хариндексов и патиндексов. Кажется, я могу извлечь шаблон $###,### из всей строки, кроме случаев, когда он падает в конце строки.

Вот код с тестовыми примерами:

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 ]

3 голосов
/ 15 марта 2019

Просто добавьте x (или любой нечисловой символ) к каждому экземпляру string:

SELECT 
    *,
    SUBSTRING(
        string + 'x', 
        CHARINDEX('$',string + 'x'), 
        PATINDEX('%[^0-9,]%',SUBSTRING(string + 'x',CHARINDEX('$',string + 'x')+1, 80000))
    ) AS Result
FROM 
    #TMP
1 голос
/ 15 марта 2019

Привет, я думаю, что это решение может работать:

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 строку как: привет у меня сейчас 20 долларов, а вчера у меня 100

Для получения дополнительной информации: https://docs.microsoft.com/en-us/sql/t-sql/functions/patindex-transact-sql?view=sql-server-2017

Другой пост: PATINDEX возвращает 0 при совпадении rexpresson

...