问题描述
在我的数据库中,我有四个用于表单构建器的表。
-
fields
(fieldID(PK)
,typeID
,fieldName
,...)-此表是所有字段的逐行列表,格式为 -
fields_types
(typeID(PK)
,htmlType
,...)-这是一个将字段链接到html类型(和其他设置)的表 -
fields_meta
(FieldMetaID(PK)
,FieldID
,mName
,mValue
)-字段的其他设置,但更具体。 textarea字段可能具有height属性,但几乎没有其他字段会使用它。 -
fields_tyeps_meta
(TypeMetaID(PK)
,typeID
,tmName
,tmValue
)-定义字段可以具有的无关设置,如果是,则还提供默认值没有明确设置)
所以我的查询当前看起来像这样
SELECT *
FROM Fields F
JOIN Field_Types FT
on FT.FieldID = F.FieldID
LEFT
JOIN Field_Meta FM
on FM.FieldID = F.FieldID
我想知道是否有一种连接Fields_Types_Meta
的方式,以便当行JOIN
到Fields_Meta
时不返回行(没有mValue
),它返回tmValue
我意识到我可以使用类似(CASE WHEN mValue = "" THEN tmValue ELSE mValue END) AS UseValue
之类的东西,但是我可能在某些字段中希望将值设置为空。
编辑:我可能可以对子查询和COUNT
进行一些操作,并使用基于此的CASE
决策。这可能不是最健康的性能,但是此查询将运行并缓存自身,直到服务器重新启动,或者直到被告知再次运行(更新为表单设计)为止
解决方法
您似乎只想¢oalesce()
:
coalesce(FM.mValue,FT.tmValue) as UseValue
当FM.mValue
为null
时,coalesce()
返回FT.tmValue
。
如果要在结果集中保留null
中的FM
个值,请改用case
表达式:
case when FM.FieldID IS NULL THEN FT.tmValue ELSE FM.mValue END as UseValue
这句话是:left join
确实在FM
中找到匹配项时,请从该行中使用mValue
(即使它是null
),否则请使用{{ 1}}。