sql - 在 SQL Server SELECT 语句中使用 CASE 时消除 NULL

标签 sql sql-server null case

我要编写一个大而杂乱的报告,该报告连接了 5 个表。一个表中的一列用于多个不同的值 - 本质上是一个“标签”列,其中根据用户想要使用的杂项元数据以创造性的方式使用标签。

结果,我对报告的查询返回了 3 个几乎相同的行,仅在“标记”列中有所不同;例如,我可能会得到:

NAME TAG EMAIL  
BOB  A   BOB@EXAMPLE.COM  
BOB  B   BOB@EXAMPLE.COM  
BOB  C   BOB@EXAMPLE.COM  

我想做的是将 TAG 列的内容拆分为 3 个单独的列从查询中返回,如下所示:

NAME A B C EMAIL
BOB  A B C BOB@EXAMPLE.COM

因此我尝试使用 SQL SERVER CASE/WHEN 功能来执行此操作;我是说,例如,当 Tag 列的值为“A”时,将其返回到“A”列;如果是“B”,就放在“B”中;等。我以为这会返回上面的内容,但它给了我这个:

NAME A    B    C    EMAIL
BOB  A    NULL NULL BOB@EXAMPLE.COM
BOB  NULL B    NULL BOB@EXAMPLE.COM
BOB  NULL NULL C    BOB@EXAMPLE.COM

这显然不太理想。

Stack Overflow 的天才们有什么想法吗?

最佳答案

您需要透视数据。

;with Report (name, tag, email) as
(
select 'BOB', 'A', 'BOB@BOB.COM' union
select 'BOB', 'B', 'BOB@BOB.COM' union
select 'BOB', 'C', 'BOB@BOB.COM' 
)
select * from Report
pivot 
( min(tag) for  tag in ([A], [B], [C]))  
as pvt

运行上述查询的结果是这样的:

NAME    EMAIL         A  B  C
-----------------------------
BOB     BOB@BOB.COM   A  B  C

关于sql - 在 SQL Server SELECT 语句中使用 CASE 时消除 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730095/

相关文章:

mysql - 当另一个对应列为空时过滤掉某些列

带下划线的 MySQL LIKE 查询

sql-server - 如何将 SQL Server 中的架构设为 "USE"

sql - 更改聚合函数以在元素为 NULL 时输出 NULL

mysql - 如果第二个表多次出现,如何连接表并获取第一个表的总和

SQL过滤条件在连接条件或where子句中哪个更有效

sql-server - 仅根据一个字段选择与先前记录相比发生更改的记录

json - 在 ms sql (SQL Server) 中以\u0 格式 (json) 转义变音

mysql - 如何使用 MySQL 将空值插入到已有值的列中

javascript - 数组在列表的开头添加 'undefined' - 抛出计数器和列表显示