Привет, я думаю, что это решение может работать:
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