如何规范化单个字段中的多值 (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
我有一个 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