select.go 1.1 KB

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