Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将PostgreSQL行扩展为多行以进行更新;自定义字段";?_Sql_Postgresql - Fatal编程技术网

如何将PostgreSQL行扩展为多行以进行更新;自定义字段";?

如何将PostgreSQL行扩展为多行以进行更新;自定义字段";?,sql,postgresql,Sql,Postgresql,我有一个第三方软件使用的表(比如用户字段),每行有一个用户id、字段id和字段值。糟透了,我知道 我还拥有自己的另一个用户表users,其中包含填充此表所需的值,但字段_id除外,它是“magic”并对应于自定义字段映射 我如何编写一个select查询来实现这一点: user_id | company_name | first_name | country --------------------------------------------------- 1 | Nu

我有一个第三方软件使用的表(比如用户字段),每行有一个用户id、字段id和字段值。糟透了,我知道

我还拥有自己的另一个用户表users,其中包含填充此表所需的值,但字段_id除外,它是“magic”并对应于自定义字段映射

我如何编写一个select查询来实现这一点:

user_id | company_name       | first_name | country
---------------------------------------------------
1       | Nutty Choc Company | Si         | GB
2       | Ljubljanske R Us   | Pie        | IT
这件事

user_id | field_value        | field_id
---------------------------------------
1       | Nutty Choc Company | 10
1       | Si                 | 11
1       | GB                 | 12
2       | Ljubljanske R Us   | 10
2       | Pie                | 11
2       | IT                 | 12
我正在使用Postgresql 8.4,并打算将查询馈送到insert

我尝试过使用unnest和数组将字段展开成行,但它在处理select中的任何其他字段后会取消检测,因此只会复制未列出行的值

有什么想法吗

干杯, 硅


编辑:格式化并澄清不可靠的名称-值表是第三方。

我的第一个想法是摆脱名称-值对体系结构。在关系数据库中,您只是在不断地寻找麻烦,正如您已经开始看到的那样

现在,把必要的责骂放在一边

INSERT INTO My_Horrible_Name_Value_Pair_Table
(
     user_id,
     field_id,
     field_value
)
SELECT
     id,
     10,
     first_name
FROM
     Users
UNION ALL
SELECT
     id,
     11,
     country
FROM
     Users
UNION ALL
SELECT
     id,
     12,
     company_name
FROM
     Users

我相信您可以想象,当您添加更多字段时,这种扩展是多么可怕。

我的第一个想法是摆脱名称-值对体系结构。在关系数据库中,您只是在不断地寻找麻烦,正如您已经开始看到的那样

现在,把必要的责骂放在一边

INSERT INTO My_Horrible_Name_Value_Pair_Table
(
     user_id,
     field_id,
     field_value
)
SELECT
     id,
     10,
     first_name
FROM
     Users
UNION ALL
SELECT
     id,
     11,
     country
FROM
     Users
UNION ALL
SELECT
     id,
     12,
     company_name
FROM
     Users

我相信你可以想象,当你添加更多的字段时,这个问题会变得多么可怕。

我将此作为一个单独的答案添加,因为它与我发布的其他问题有很大的不同。您可以尝试以下方法:

SELECT
     U.id,
     UF.id AS field_id,
     CASE UF.id
          WHEN 10 THEN U.first_name
          WHEN 11 THEN U.country
          WHEN 12 THEN U.company_name
          ELSE NULL
     END AS field_value
FROM
     Users U
CROSS JOIN User_Fields UF

这是假设您有一个User_Fields表(或任何可能命名的表),它提供了所有可能的用户字段。不过,您必须使您的案例陈述保持最新。

我将此作为一个单独的答案添加,因为它与我发布的另一个非常不同。您可以尝试以下方法:

SELECT
     U.id,
     UF.id AS field_id,
     CASE UF.id
          WHEN 10 THEN U.first_name
          WHEN 11 THEN U.country
          WHEN 12 THEN U.company_name
          ELSE NULL
     END AS field_value
FROM
     Users U
CROSS JOIN User_Fields UF

这是假设您有一个User_Fields表(或任何可能命名的表),它提供了所有可能的用户字段。不过,您必须使您的案例陈述保持最新。

请缩进代码示例以增加可读性。请缩进代码示例以增加可读性。我确实可以想象。不幸的是,我无法控制名称-值对。我可能会尝试使用“with”查询,因为我需要一些可能会很昂贵的底层连接。你认为有没有一种简单的方法将10、11、12作为重复值加入到不需要的值中?我确实可以想象。不幸的是,我无法控制名称-值对。我可能会尝试使用“with”查询,因为我需要一些可能会很昂贵的底层连接。你认为有没有一种简单的方法可以将10、11、12作为重复值加入到不需要的值中?