github.com/systematiccaos/gorm@v1.22.6/clause/select.go (about) 1 package clause 2 3 // Select select attrs when querying, updating, creating 4 type Select struct { 5 Distinct bool 6 Columns []Column 7 Expression Expression 8 } 9 10 func (s Select) Name() string { 11 return "SELECT" 12 } 13 14 func (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 31 func (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. 48 type CommaExpression struct { 49 Exprs []Expression 50 } 51 52 func (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 }