Skip to content

Instantly share code, notes, and snippets.

@agis
Created April 28, 2017 10:40
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save agis/7e8cd4c7a20d037c01e663402fcad9d0 to your computer and use it in GitHub Desktop.
Save agis/7e8cd4c7a20d037c01e663402fcad9d0 to your computer and use it in GitHub Desktop.
Get SQL count in Postgres with Go (golang)
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func main() {
var count int
db, err := sql.Open("postgres", "user=test password=test dbname=foo sslmode=disable")
if err != nil {
log.Fatal(err)
}
defer db.Close()
row := db.QueryRow("SELECT COUNT(*) FROM table_name")
err := row.Scan(&count)
if err != nil {
log.Fatal(err)
}
fmt.Println(count)
}
@shyandsy
Copy link

what if the select statement has lots of condition?

@chagui
Copy link

chagui commented Oct 23, 2019

@pijng
Copy link

pijng commented Mar 2, 2024

Full example of querying the results with count by where clause with order and offset:

func (s *RecordStorage) GetRecordsByQuery(record entities.Record, from *time.Time, to *time.Time, limit int, offset int) ([]*entities.Record, int, error) {
	var queryBuilder strings.Builder

	queryBuilder.WriteString("(schema_id = ? OR schema_name = ?)")
	queryParams := []interface{}{record.SchemaID, record.SchemaName}

	if record.Text != "" {
		queryBuilder.WriteString(" AND text LIKE ?")
		queryParams = append(queryParams, fmt.Sprintf(""%%%s%%"", record.Text))
	}
	if record.Kind != "" {
		queryBuilder.WriteString(" AND kind = ?")
		queryParams = append(queryParams, record.Kind)
	}
	if record.Level != "" {
		queryBuilder.WriteString(" AND level = ?")
		queryParams = append(queryParams, record.Level)
	}

	queryBuilder.WriteString("AND created_at BETWEEN %d AND %d")
        queryParams = append(queryParams, from.Unix(), to.Unix())

	countBuilder := queryBuilder
	countParams := queryParams

	queryBuilder.WriteString(" ORDER BY id DESC LIMIT ? OFFSET ?")
	queryParams = append(queryParams, limit, offset)

	query := fmt.Sprintf(`
		SELECT
			(SELECT COUNT(*) FROM records WHERE %s) AS total_count,
			records.*
		FROM
			records
		WHERE %s`, countBuilder.String(), queryBuilder.String(),
	)

	totalParams := append(countParams, queryParams...)

	rows, err := s.db.QueryContext(s.ctx, query, totalParams...)
	if err != nil {
		return nil, 0, fmt.Errorf("failed querying record: %w", err)
	}

	var totalCount int
	var lr []*entities.Record

	for rows.Next() {
		var dest entities.Record

		err := rows.Scan(&totalCount, &dest.ID, &dest.Text, &dest.CreatedAt, &dest.SchemaName, 
                   &dest.SchemaID, &dest.Query, &dest.Kind, &dest.GroupHash, &dest.Level, &dest.Request, &dest.Response)

		if err != nil {
			return nil, 0, fmt.Errorf("failed querying record: %w", err)
		}

		lr = append(lr, &dest)
	}

	return lr, totalCount, nil
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment