我正在尝试使用子字符串,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
结果:
SQL Server版本:
Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64)
答案 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