如何规范化单个字段中的多值 (SQL)

How to normalize a multi-values in a single field (SQL)

我有一个 table,它由列名 Foo 和 Bar 组成,其中 Foo 是唯一 ID,bar 包含由 ~

分隔的多值
Foo Bar
1   A~B~
2   A~C~D

我需要这样规范化它:

Foo Bar
1   A
1   B
2   A
2   C
2   D

虽然我可以从 Excel 开始,通过将 TEXT 分隔到列然后旋转,但这是不可行的,因为我有超过 100 万条记录,并且 Bar 列可能包含多达 12 个不同的值。

有没有一种简单的方法可以直接从 SQL 进行操作?

你这里有一个标准的一对多关系。所以你有 1 个 Foo 到许多 Bars。所以你需要让你的数据在这里遵守第二范式(2NF)。

这里有一个 SO post 解释了将字符串列值拆分为所需行的最佳方法: Turning a Comma Separated string into individual rows

您没有指定您的 DBMS,所以这是针对 Postgres 的:

select t.foo, b.bar
from the_table t, 
     unnest(string_to_array(t.bar, '~')) as b(bar);

谢谢大家。即使我不理解 XML 或逻辑,下面的脚本也能发挥作用。

SELECT A.FOO,
Split.a.value('.', 'VARCHAR(100)') 作为数据
来自
( SELECT FOO,
CAST ('' + REPLACE(BAR, ',', '') + '' AS XML) AS Data
从表 1 ) 作为交叉应用 Data.nodes ('/M') AS Split(a);

参考: Turning a Comma Separated string into individual rows