mirror of https://github.com/go-gorm/gorm.git
55 lines
1.0 KiB
Go
55 lines
1.0 KiB
Go
|
package clause
|
||
|
|
||
|
type ExprCaseCondition struct {
|
||
|
When string
|
||
|
Then string
|
||
|
Vars []any
|
||
|
}
|
||
|
|
||
|
type ExprCaseElse struct {
|
||
|
Then string
|
||
|
Vars []any
|
||
|
}
|
||
|
|
||
|
type ExprCase struct {
|
||
|
Cases []*ExprCaseCondition
|
||
|
Else *ExprCaseElse
|
||
|
}
|
||
|
|
||
|
func (expr ExprCase) Name() string {
|
||
|
return "CASE"
|
||
|
}
|
||
|
|
||
|
func (expr ExprCase) Build(builder Builder) {
|
||
|
var vars []any
|
||
|
for idx, condition := range expr.Cases {
|
||
|
if idx > 0 {
|
||
|
_ = builder.WriteByte(' ')
|
||
|
}
|
||
|
_, _ = builder.WriteString("WHEN ")
|
||
|
_, _ = builder.WriteString(condition.When)
|
||
|
_, _ = builder.WriteString(" THEN ")
|
||
|
_, _ = builder.WriteString(condition.Then)
|
||
|
if len(condition.Vars) > 0 {
|
||
|
vars = append(vars, condition.Vars...)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if expr.Else != nil {
|
||
|
elseExpr := expr.Else
|
||
|
_, _ = builder.WriteString(" ELSE ")
|
||
|
_, _ = builder.WriteString(elseExpr.Then)
|
||
|
if len(elseExpr.Vars) > 0 {
|
||
|
vars = append(vars, elseExpr.Vars...)
|
||
|
}
|
||
|
}
|
||
|
_, _ = builder.WriteString(" END")
|
||
|
|
||
|
clauseExpr := Expr{SQL: "", Vars: vars}
|
||
|
clauseExpr.Build(builder)
|
||
|
}
|
||
|
|
||
|
func (expr ExprCase) MergeClause(clause *Clause) {
|
||
|
clause.Expression = expr
|
||
|
}
|