TSQL 问题:
我在列中显示一个字符串值,如下所示:
Row ID, Name, Column1 1, Bob, |Gender - Male| 2, Sally, |Gender - Female| |Age - 30| 3, John, |Gender - Male| 4, Thomas, |Gender - Male| 5, Lewis, |Gender - Male| |Age - 20|
I only want to extract the value from the Column1 if there is only one group of ||, so for example in another column, column2, I have done
Replace(substring(column1,charindex('-',column1)+2,charindex('|',column1) ),'|','') AS column2
如果有一组 |,这会给我值,但是我如何忽略 2 组管道,就像有 2 组管道一样,然后它提取第一组,也不提取第二组的管道。 如果有 2 组管道,我希望能够忽略该值并将其保留在列中,并且仅更新具有 1 组管道的管道。
因此上面的示例数据集应该如下所示:
Row ID, Name, Column1 1, Bob, Male 2, Sally, |Gender - Female| |Age - 30| 3, John, Male 4, Thomas, Male 5, Lewis, |Gender - Male| |Age - 20|
我在想也许可以以某种方式扫描第 1 列字符串值,如果有超过 1 个 -(破折号)符号则忽略?
或者有更好的方法吗?
最佳答案
正如其他人提到的,您的架构设计应该重新设计为规范化的结构。至于您的 column2 示例,不确定您要在那里做什么,因为它正在寻找“=”符号。
带有 CASE WHEN 的 SQL 子字符串
这是一个返回您预期输出的脚本:
DROP TABLE IF EXISTS #Temp
CREATE TABLE #Temp
(
RowID INT
,[Name] Varchar(100)
,Column1 VARCHAR(1000)
)
INSERT INTO #Temp
VALUES
(1,'Bob','|Gender - Male|')
,(2,'Sally','|Gender - Female| |Age - 30|')
,(3,'John','|Gender - Male|')
,(4,'Thomas','|Gender - Male|')
,(5,'Lewis','|Gender - Male| |Age - 20|')
SELECT *
,ParsedColumn = CASE
/*Only parse if exactly 2 pipes in data*/
WHEN NumOfPipes = 2 THEN SUBSTRING(Column1,B.IdxFirstHyphen + 2,C.IdxFirstPipeAfterFirstDash-B.IdxFirstHyphen - 2)
/*Else return raw data from column1*/
ELSE Column1
END
FROM #Temp
CROSS APPLY (
SELECT NumOfPipes = LEN(Column1) - LEN(REPLACE(Column1,'|',''))
,IdxFirstHyphen = CHARINDEX('-',Column1) /*Location of first hyphen*/
) AS B
CROSS APPLY (SELECT IdxFirstPipeAfterFirstDash = CHARINDEX('|',Column1,B.IdxFirstHyphen)) AS C /*Location of first pipe after the first hyphen*/
关于sql 字符串值并且仅从管道部分中提取第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71312586/