| 330 | } |
| 331 | |
| 332 | func (s Select) SQL(b *Builder) string { |
| 333 | var parts []string |
| 334 | |
| 335 | var fields []string |
| 336 | for _, f := range s.Fields { |
| 337 | fields = append(fields, f.SQL(b)) |
| 338 | } |
| 339 | parts = append(parts, "SELECT "+strings.Join(fields, ", ")) |
| 340 | |
| 341 | var tables []string |
| 342 | for _, t := range s.From { |
| 343 | tables = append(tables, t.SQL(b)) |
| 344 | } |
| 345 | parts = append(parts, "FROM "+strings.Join(tables, ", ")) |
| 346 | |
| 347 | if len(s.Where) != 0 { |
| 348 | var wheres []string |
| 349 | for _, w := range s.Where { |
| 350 | wheres = append(wheres, w.SQL(b)) |
| 351 | } |
| 352 | parts = append(parts, "WHERE "+strings.Join(wheres, " AND ")) |
| 353 | } |
| 354 | if s.Limit > 0 { |
| 355 | parts = append(parts, "LIMIT "+strconv.FormatInt(s.Limit, 10)) |
| 356 | } |
| 357 | if s.Offset > 0 { |
| 358 | parts = append(parts, "OFFSET "+strconv.FormatInt(s.Offset, 10)) |
| 359 | } |
| 360 | sep := " " |
| 361 | if len(fields) > 1 { |
| 362 | sep = "\n\t" |
| 363 | } |
| 364 | return strings.Join(parts, sep) |
| 365 | } |
| 366 | func (s Select) Args() []Value { |
| 367 | var args []Value |
| 368 | // first add args for FROM subqueries |