我想将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类似,可能有任意数量的标签,条件因标签列而异,每个标签的条件都有多行。如果有人处理过类似的问题,并且有任何建议值得赞赏。
答案 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)