T-SQL。在定界符的非一致实例之间分割字符值。

问题描述 投票:0回答:1

有一个字符串伴随着一个值,我需要从一列中提取。我可以从大多数行中提取值,但有一些情况下,值的属性不同。这是一个简化的问题示例。

IF OBJECT_ID('TEMPDB..#TABLE') IS NOT NULL
    DROP TABLE #TABLE

CREATE TABLE #TABLE(
colSTRING           NVARCHAR(MAX)       NULL
);
INSERT INTO #TABLE (colSTRING)
VALUES (',SHOULD NOT BE STORED THIS WAY:22.67')
    ,(',SHOULD NOT BE STORED THIS WAY:46.32')
    ,(',SHOULD NOT BE STORED THIS WAY:23.45')
    ,(',SHOULD NOT BE STORED THIS WAY:66.67')
    ,(',SHOULD NOT BE STORED THIS WAY:22.35,ANOTHER BAD THING:OK')
;
SELECT * FROM #TABLE

输出。OUTPUT1

请注意,在':'右边的字符串末尾有一个数字。这是我需要提取的数字。

然而,最下面一行显示,在同一单元格中还有第二个字符串条目。我需要从这个单元格中提取22.35,同时省略字符串的其余部分。

这就是我目前的结果。

SELECT 
    (RIGHT(colSTRING,CHARINDEX(':',REVERSE(colSTRING))-1)) [STRING NUMBER]
FROM #TABLE

输出。OUTPUT2

这对表格中的其他值是有效的,但是最下面一行没有提取到正确的值。它提取的是第二个字符串条目':'右边的字符串。

有什么方法可以只对第一次出现的':'使用这种逻辑吗?

sql-server tsql ssms
1个回答
0
投票

这就是我解决这个问题的方法,感谢 @MartinSmith 的想法。我调整了一下这个例子,以显示如何与一个超过2位数的数字(>=100.00)进行交互。

IF OBJECT_ID('TEMPDB..#TABLE') IS NOT NULL
    DROP TABLE #TABLE

CREATE TABLE #TABLE(
colSTRING           NVARCHAR(MAX)       NULL
);
INSERT INTO #TABLE (colSTRING)
VALUES (',SHOULD NOT BE STORED THIS WAY:22.67')
    ,(',SHOULD NOT BE STORED THIS WAY:46.32')
    ,(',SHOULD NOT BE STORED THIS WAY:23.45')
    ,(',SHOULD NOT BE STORED THIS WAY:766.67')
    ,(',SHOULD NOT BE STORED THIS WAY:22.35,ANOTHER BAD THING:OK')
;
SELECT * FROM #TABLE

解决方案。在这种情况下,每个字符串条目总是以逗号开始。我可以在CASE语句中使用这些信息。当有数字<100.00或>=100.00时,我为每一个case做了一列有填充条目的列。

SELECT ISNULL(CASE WHEN [2DIGITS] LIKE ',%' THEN NULL ELSE [2DIGITS] END,[3DIGITS]) [FIXED]
FROM(
SELECT 
    (RIGHT(colSTRING,CHARINDEX(':',REVERSE(colSTRING))-1)) [STRING NUMBER]
    ,SUBSTRING(colSTRING,1 + PATINDEX('%:[0-9][0-9].[0-9][0-9]%', colSTRING),5) [2DIGITS]
    ,SUBSTRING(colSTRING,1 + PATINDEX('%:[0-9][0-9][0-9].[0-9][0-9]%', colSTRING),6) [3DIGITS]
FROM #TABLE
)A
© www.soinside.com 2019 - 2024. All rights reserved.