sql 字符串值并且仅从管道部分中提取第一个值

标签 sql t-sql split

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/

相关文章:

sql - 如何为 SQL Server 数据库中的所有表创建触发器

sql - 查询考试成绩计算

python - 分割Python数据框字符串并将最后分割的部分保存到新列中

sql-server - SQL Server 中的类型 "void"是什么?

sql - 我如何需要将 ID 和名称传递给变量并执行过程

split - 为什么我们应该在将 StratifiedKFold() 作为 GridSearchCV 的参数传递时调用 split() 函数?

python - 如何从 txt 文件中的拆分行制作嵌套列表?

SQL外部表列长度问题

sql - 我们是否应该将代理键与自然键(唯一索引均值)结合起来以提高可读性并易于查询选择?

mysql - MySQL 中的 ROW_NUMBER()