0

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

  • 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,以便当该行的JOINtoFields_Meta不返回一行(否mValue)时,它返回tmValue

我意识到我可以使用类似的东西(CASE WHEN mValue = "" THEN tmValue ELSE mValue END) AS UseValue,但我可能有一些字段我想允许将值设置为空。


编辑:我可能可以用子查询做一些事情,并且COUNT使用CASE基于它的决定。它可能不是最健康的性能,但是这个查询运行并缓存自己直到服务器重新启动,或者直到它被告知再次运行(更新表单设计)

4

1 回答 1

1

看起来你只是想要¢oalesce()

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

FM.mValueis时nullcoalesce()返回FT.tmValue

如果您有要保留在结果集中的null值,请改用表达式:FMcase

case when FM.FieldID IS NULL THEN FT.tmValue ELSE FM.mValue END as UseValue

这句话是:当left join确实在 中找到匹配项时FMmValue从该行使用(即使它是null),否则使用FT.tmValue.

于 2020-08-16T22:43:23.470 回答