假设有以下两个表(并忽略数据库设计的质量):
- 表 1 有列
id
,sequence_number
,value
:它包含许多行。 - 表 2 有列
id
,seq1
,seq2
,seq3
,seq4
,seq5
:它是空的。
目标是用表 1 的值填充表 2,这样如果表 1 中的一行是sequence_number = 3
;value = 1564.1
, 那么在表 2 中应该插入一行seq3 = 1564.1
. (除此之外的其他列id
应为空)。
如何在 SQL 中做到这一点?我不想对所有 5 个选项进行硬编码(因为在我的实际用例中有超过 50 个。),但我不知道如何根据值来调整应该接收值的列名。
通过使用 CASE 语句..
如果您考虑硬编码,那么(据我所知)您唯一的其他选择是 plpgsql 块中的动态 SQL。
这基本上是交叉制表/交叉表/数据透视表的问题。
鉴于这些确切的表定义:
您只需要这个基本的交叉表查询:
也是我能想到的最快的方法。
您需要安装附加模块 tablefunc。基本:
如果您的任何一个表有更多列,请在第一个参数中更明确和/或适应更多列:
更多自动化
如果你必须经常这样做,你可以进一步自动化:
crosstab_n()
使用链接答案中定义的 2 参数形式,查询可以很简单:seq
N
如果您有那么多列,请将 5 替换为 50 。