【问题标题】:Merge Multiple SQL Table Columns into One将多个 SQL 表列合并为一个
【发布时间】:2022-01-07 21:46:26
【问题描述】:

我有一个这样的表(有一千行):

ogr_fid (PK, int, not null) 90 (varchar(157), null) 80 (varchar(157), null) 70 (varchar(157), null)
1 some_text NULL NULL
2 NULL NULL other_text
3 NULL more_text NULL
4 even_more_text NULL NULL
5 NULL NULL NULL

我想合并表格如下;

ogr_fid (PK, int, not null) m_agl (int, null)
1 90
2 70
3 80
4 90
5 NULL

如您所见,我将使用文本作为简单的IS NOT NULL 类测试。合并后的列将填充 IS NOT NULL 列的名称。

我一直在尝试理解 IIF 和 CASE,但如果没有工作示例可以学习,这远远超出了我目前的理解水平。

我最近的尝试:

ALTER TABLE [dbo].[my_table] ADD [m_agl] AS SELECT 
   CASE WHEN 90 IS NOT NULL THEN '90'
   CASE WHEN 80 IS NOT NULL THEN '80'
   CASE WHEN 70 IS NOT NULL THEN '70'
GO

ALTER TABLE [dbo].[my_table] DROP COLUMN (90, 80, 70)
GO

非常感谢。

【问题讨论】:

  • “我一直在努力理解 IIF 和 CASE”——官方文档有很多清晰易懂的例子。
  • 首先,您需要对列名进行转义,因为它们本身不是标识符——所以[90], [80], [70]——否则它们只会被解释为整数常量。其次,您不能基于这些列添加计算列,然后删除这些列 - 您需要一个 new 列,该列从空开始,然后使用 UPDATE 填充。跨度>

标签: sql sql-server tsql


【解决方案1】:

注意,列名不能是裸整数。

使用IIF的解决方案

ALTER TABLE [dbo].[my_table] ADD [column_merged];
GO

SELECT ogr_fid, IIF(column_1 IS NOT NULL, column_1, IIF(column_2 IS NOT NULL, column_2, IIF(column_3 IS NOT NULL, column_3, NULL)))
FROM dbo.my_table;
GO

ALTER TABLE [dbo].[my_table] DROP COLUMN (column_1, column_2, column_3);
GO

通过Microsoft Docs了解更多关于CASE的信息
通过Microsoft Docs了解更多关于IIF的信息

【讨论】:

  • 列名不能是裸整数。这是不正确的。 强烈反对,因为它违反了常规标识符的规则,但如果是,它可以并且将需要分隔符。
  • 我怀疑 @Smor,“赤裸”用户的意思是“未确定定界”(尽管我在编辑帖子时不想做出这样的假设) ,因为它们确实在其 SQL 中引用了几个分隔标识的列,其中名称仅包含数字字符。
  • 您确定不需要使用is null(与not)而不是<> NULL?您的代码如何到达新列的值 '70'、'80' 和 '90'?
  • 哦刚刚注意到语法问题,已编辑并解决! '70'、'80' 和 '90' 根据问题在哪里使答案易于理解.. 无论如何谢谢@HABO
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2020-07-19
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
相关资源
最近更新 更多