1package clause 2 3// Select select attrs when querying, updating, creating 4type Select struct { 5 Distinct bool 6 Columns []Column 7 Expression Expression 8} 9 10func (s Select) Name() string { 11 return "SELECT" 12} 13 14func (s Select) Build(builder Builder) { 15 if len(s.Columns) > 0 { 16 if s.Distinct { 17 builder.WriteString("DISTINCT ") 18 } 19 20 for idx, column := range s.Columns { 21 if idx > 0 { 22 builder.WriteByte(',') 23 } 24 builder.WriteQuoted(column) 25 } 26 } else { 27 builder.WriteByte('*') 28 } 29} 30 31func (s Select) MergeClause(clause *Clause) { 32 if s.Expression != nil { 33 if s.Distinct { 34 if expr, ok := s.Expression.(Expr); ok { 35 expr.SQL = "DISTINCT " + expr.SQL 36 clause.Expression = expr 37 return 38 } 39 } 40 41 clause.Expression = s.Expression 42 } else { 43 clause.Expression = s 44 } 45} 46 47// CommaExpression represents a group of expressions separated by commas. 48type CommaExpression struct { 49 Exprs []Expression 50} 51 52func (comma CommaExpression) Build(builder Builder) { 53 for idx, expr := range comma.Exprs { 54 if idx > 0 { 55 _, _ = builder.WriteString(", ") 56 } 57 expr.Build(builder) 58 } 59} 60