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
我正在尝试使用子字符串、字符索引和 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