具有不同类型

时间:2015-04-22 09:53:55

标签: mysql sql postgresql

我有以下表格,其中我存储了我的应用程序的属性(仅供参考我不是在我的应用程序中直接使用SQL而是Python Django,它允许我有这样的结构):

      string_properties
 id  |  name         | value (type=string)
  1  :  module.ip    : "127.0.0.1"
  2  :  module.name  : "a_name"
     :               :

      integer_properties
 id  |  name       | value (type=integer)
  1  : module.size : 10
  2  : module.port : 80
     :             :

      boolean_properties
 id  |  name             | value (type=bool)
  1  : module.activated  : 1
     :                   :

我想生成一个视图,显示每个属性,相关的值。

我尝试了几种策略:

1-使用基本的UNION:它不起作用,因为“value”列在我的所有表中都不是同一类型

2-更改“value”列的名称,为其添加后缀(如value_int,value_string等)。然后我本来希望能够使用UNION语句,但它也失败了。我很满意如下的结果表:

      result
 id  |  name             | value_int | value_string | value_bool
  1  :  module.ip        :     null  : "127.0.0.1"  : null
  2  :  module.name      :     nulll : "a_name"     : null
  3  : module.activated  :     null  :  null        :  1
  4  : module.size       :      10   :  null        : null
  5  : module.port       :      80   :  null        : null
     :                   :

3-我想我可以将所有值转换为字符串然后将表格转换为UNION,但丢失类型会很难看。

你怎么看?

3 个答案:

答案 0 :(得分:1)

SELECT id, name, value AS value_int, null AS value_string, null AS value_bool
FROM integer_properties
UNION ALL
SELECT id, name, null AS value_int, value AS value_string, null AS value_bool
FROM string_properties
UNION ALL
SELECT id, name, null AS value_int, null AS value_string, value AS value_bool
FROM boolean_properties

答案 1 :(得分:1)

我建议您按照建议使用UNION ALL并投射值。

SELECT 
    id, 
    name, 
    value
FROM
    string_properties
UNION ALL 
SELECT 
    id, 
    name, 
    CAST(value AS CHAR(50)) AS value
FROM
    integer_properties
UNION ALL 
SELECT 
    id, 
    name, 
    CAST(value AS CHAR(50)) AS value
FROM
    boolean_properties

如果您想知道某个值的来源,可以添加第四列 - 例如该表中其他字段中的SELECT "string_properties" AS parent_table(对其他表执行相同操作,使用不同的字符串值,也称为parent_table

答案 2 :(得分:1)

如果您“不想丢失类型”,可以在UNION中选择基础类型作为常量:

CREATE VIEW all_properties AS
SELECT id, name, typ, value
FROM    (
        SELECT sp.id AS id
        , sp.name AS name
        , 'String' AS typ
        , sp.value AS value
        FROM string_properties sp
UNION ALL
        SELECT ip.id AS id
        , ip.name AS name
        , 'Integer' AS typ
        , ip.value::varchar AS value
        FROM integer_properties ip
UNION ALL
        SELECT bp.id AS id
        , bp.name AS name
        , 'Boolean' AS typ
        , bp.value::varchar AS value
        FROM boolean_properties bp
        ) x
        ;
SELECT * FROM all_properties ap
ORDER BY id,name
        ;