我有以下表格,其中我存储了我的应用程序的属性(仅供参考我不是在我的应用程序中直接使用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,但丢失类型会很难看。
你怎么看?答案 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
;