如何将PostgreSQL行扩展为多行以更新“自定义字段”?

时间:2009-12-01 13:47:44

标签: sql postgresql

我有一个第三方软件(比如user_fields)使用的表,每行有一个user_id,一个field_id和一个field_value。我知道蹩脚。

我还有另一个我自己的用户用户表,其中包含填充此用户所需的值,除了field_id是“魔术”并且对应于自定义字段映射。

如何编写一个可以解决这个问题的选择查询:

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,并打算将查询输入到插入。

我通过使用unexst和一个数组进行了一次尝试,将字段扩展为行,但是在处理select中的任何其他字段后它就不需要了,所以只复制unnested行的值。

有什么想法吗?

干杯, 硅

编辑:格式化和澄清狡猾的名称 - 值表是第三方。

2 个答案:

答案 0 :(得分:1)

我将此作为单独的答案添加,因为它与我发布的其他答案完全不同。你可以尝试这样的事情:

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表(或者它可能被命名的任何表),它为你提供了所有可能的用户字段。你必须保持CASE陈述是最新的。

答案 1 :(得分:0)

我的第一个想法是摆脱名称 - 值对架构。在关系数据库中,你只是在寻找永无止境的麻烦,因为你已经开始看到了。

现在有了所需的责骂......

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

我相信你可以想象,当你添加更多的字段时,它会有多么可怕。