有一个字符串伴随着一个值,我需要从一列中提取。我可以从大多数行中提取值,但有一些情况下,值的属性不同。这是一个简化的问题示例。
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
请注意,在':'右边的字符串末尾有一个数字。这是我需要提取的数字。
然而,最下面一行显示,在同一单元格中还有第二个字符串条目。我需要从这个单元格中提取22.35,同时省略字符串的其余部分。
这就是我目前的结果。
SELECT
(RIGHT(colSTRING,CHARINDEX(':',REVERSE(colSTRING))-1)) [STRING NUMBER]
FROM #TABLE
这对表格中的其他值是有效的,但是最下面一行没有提取到正确的值。它提取的是第二个字符串条目':'右边的字符串。
有什么方法可以只对第一次出现的':'使用这种逻辑吗?
这就是我解决这个问题的方法,感谢 @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