JOIN返回一行时使用ValueA,否则使用ValueB如默认值

问题描述

在我的数据库中,我有四个用于表单构建器的表。

  • fieldsfieldID(PK)typeIDfieldName,...)-此表是所有字段的逐行列表,格式为
  • fields_typestypeID(PK)htmlType,...)-这是一个将字段链接到html类型(和其他设置)的表
  • fields_metaFieldMetaID(PK)FieldIDmNamemValue)-字段的其他设置,但更具体。 textarea字段可能具有height属性,但几乎没有其他字段会使用它。
  • fields_tyeps_metaTypeMetaID(PK)typeIDtmNametmValue)-定义字段可以具有的无关设置,如果是,则还提供默认值没有明确设置)

所以我的查询当前看起来像这样

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的方式,以便当行JOINFields_Meta时不返回行(没有mValue),它返回tmValue

我意识到我可以使用类似(CASE WHEN mValue = "" THEN tmValue ELSE mValue END) AS UseValue之类的东西,但是我可能在某些字段中希望将值设置为空。


编辑:我可能可以对子查询和COUNT进行一些操作,并使用基于此的CASE决策。这可能不是最健康的性能,但是此查询将运行并缓存自身,直到服务器重新启动,或者直到被告知再次运行(更新为表单设计)为止

解决方法

您似乎只想¢oalesce()

coalesce(FM.mValue,FT.tmValue) as UseValue

FM.mValuenull时,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}}。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...