将DB规则转换为if-else条件?

时间:2018-02-13 03:05:20

标签: sql-server database scala

我想将SQL Server数据库中的一组行(以规则的形式)转换为单个if-else条件,而不对代码中的任何值进行硬编码。代码将用Scala编写,我试图找出执行此操作的逻辑,但无法想到一个好的方法。

示例SQL Server行:

TAG |  CONDITION | MIN VALUE | MAX VALUE | STATUS

ABC |     =      | 0         |  NULL     | GOOD

ABC |     =      | 1         |  NULL     | BAD

ABC |     =      | 2         |  NULL     | ERROR

ABC |     >=     | 3         |  NULL     | IGNORE

与标签ABC类似,可能有任意数量的标签,条件因标签列而异,每个标签的条件都有多行。如果有人处理过类似的问题,并且有任何建议值得赞赏。

1 个答案:

答案 0 :(得分:0)

目前我写的这个问题似乎并不清晰。如果没有对代码中的任何值进行硬编码,那么“单个if-else条件”是什么意思?

以下是否有效?

sealed trait Condition
object Eq extends Condition // =
object Ge extends Condition // >=

sealed trait Status
object Good extends Status
object Bad extends Status
object Error extends Status
object Ignore extends Status

case class Rule(tag: String,
                condition: Condition,
                min: Int,
                max: Int,
                status: Status)

def handle(input: Int, rules: List[Rule]): Status =
  rules
      .view // lazily iterate the rules
      .filter { // find matching rules
        case Rule(_, Eq, x, _, _) if input == x => true
        case Rule(_, Ge, x, _, _) if input >= x => true
        case _ => false
      }
      .map { matchingRule => matchingRule.status } // return the status
      .head // find the status of the first matching rule, or throw


// Tests

val rules = List(
  Rule("abc", Eq, 0, 0, Good),
  Rule("abc", Eq, 1, 0, Bad),
  Rule("abc", Eq, 2, 0, Error),
  Rule("abc", Ge, 3, 0, Ignore))

assert(handle(0, rules) == Good)
assert(handle(1, rules) == Bad)
assert(handle(2, rules) == Error)
assert(handle(3, rules) == Ignore)
assert(handle(4, rules) == Ignore)