【发布时间】: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