【发布时间】:2018-05-10 09:17:43
【问题描述】:
我正在使用实体-属性-值 (EAV) 模式来存储目标对象的“覆盖”。也就是三个表:
- 实体,包含目标记录
- 属性,包含实体表中“可覆盖”列的列名
- 覆盖,包含 EAV 记录
我想做的是从实体表中选择覆盖以及“覆盖”列的值。因此,需要在 SQL 中动态使用属性名称。
我在 (PostgreSQL) SQL 中的幼稚尝试:
SELECT
OV.entity_id as entity,
AT.name as attribute,
OV.value as value,
ENT.base_value as base_value
FROM "override" AS OV
LEFT JOIN "attribute" as AT
ON (OV.attribute_id = AT.id)
LEFT JOIN LATERAL (
SELECT
id,
AT.name as base_value -- AT.name doesn't resolve to a SQL identifier
FROM "entity"
) AS ENT
ON ENT.id = OV.entity_id;
这不起作用,因为AT.name 不会解析为 SQL 标识符,而是简单地返回列名,例如“col1”、“col2”等,而不是使用列名查询 Entity。
我知道这是动态 SQL,但我对 PL/pgSQL 还是很陌生,因为它是相关/横向连接的,所以我无法弄清楚。另外,这是否可能,因为列类型不是同质类型的?请注意,覆盖表中的所有“值”都存储为字符串以解决此问题。
任何帮助将不胜感激!
【问题讨论】:
-
样本数据和期望的结果会有所帮助。
标签: sql postgresql plpgsql dynamic-sql