SQL如何将一列拆分为多个变量列

标签 sql sql-server-2008 tsql

我正在使用 MSSQL,尝试将一个字符串列拆分为多个列。字符串列包含用分号分隔的数字,例如:

190230943204;190234443204;

但是,某些行的数字比其他行多,因此在数据库中您可以拥有

190230943204;190234443204;
121340944534;340212343204;134530943204

我见过一些将一列拆分为特定数量的列的解决方案,但没有看到可变列。数据较少的列(由逗号分隔的 2 系列字符串,而不是 3 个)将在第三位出现空值。

想法?如果我需要澄清任何事情,请告诉我。

最佳答案

将这些数据拆分为单独的列是一个非常好的开始(逗号分隔的值是异端邪说)。但是,“可变数量的属性”通常应建模为 one-to-many relationship .

CREATE TABLE main_entity (
  id INT PRIMARY KEY,
  other_fields INT
);

CREATE TABLE entity_properties (
  main_entity_id INT PRIMARY KEY,
  property_value INT,
  FOREIGN KEY (main_entity_id) REFERENCES main_entity(id)
);

entity_properties.main_entity_idforeign keymain_entity.id

恭喜你,你走在正确的道路上,这就是 normalisation 。您即将到达First Normal Form.

但是,请注意,这些属性应该具有明显相似的性质(即所有电话号码或地址等)。不要陷入黑暗面(又名 Entity-Attribute-Value anti-pattern ),并试图将所有属性放入同一个表中。如果您可以识别多种类型的属性,请将每种类型存储在单独的表中。

关于SQL如何将一列拆分为多个变量列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17414632/

相关文章:

sql-server - 地理空间支持,SQL Server 08 vs MongoDB?

sql-server-2008 - xp_fileexist 与 IF EXISTS

sql - 确定连续的日期间隔

.net - 在 SQL 2005+ 中,CLR 存储过程是否优于 TSQL 存储过程?

sql - 单独放置 WHERE 语句以使 UNION 函数起作用

php - MySQL对表结构进行查询以制作JSON友好格式

sql - 根据某些条件从表中查询

sql - 表单中的必填字段现在必须设为可选,新字段成为必填字段,同时与原始字段具有可选关系

sql - 有没有办法在 INSERT..SELECT 语句中有条件地使用默认列值?

sql - 如何修复 sql server 2005 中的用户定义函数标量值性能问题?