How to tell SQL returns empty result

2,374 views
Skip to first unread message

Tong Sun

unread,
Nov 14, 2013, 7:40:47 PM11/14/13
to golan...@googlegroups.com
Hi,

A typical GO SQL query snip looks like this:


  1. rows, _ := db.Query("SELECT id, name FROM users;")
  2. for rows.Next() {
  3. rows.Scan(&user)
  4. }

However,  how can I tell if the SQL query returns empty results?

Thanks

Jesse McNelis

unread,
Nov 14, 2013, 8:18:36 PM11/14/13
to Tong Sun, golang-nuts
You can count them.
i := 0
for rows.Next(){
  i++
  err := rows.Scan(&user)
  //handle error and process user
}
if i == 0 {
  //there were zero rows
}

--
=====================
http://jessta.id.au

Tong Sun

unread,
Nov 15, 2013, 9:15:48 AM11/15/13
to Jesse McNelis, golang-nuts
On Thu, Nov 14, 2013 at 8:18 PM, Jesse McNelis <jes...@jessta.id.au> wrote:
However,  how can I tell if the SQL query returns empty results?

You can count them.

That was my backup plan. Was hoping for something more elegant...

Thanks anyway.

Julien Schmidt

unread,
Nov 15, 2013, 12:56:27 PM11/15/13
to golan...@googlegroups.com, Jesse McNelis
It depends on how many rows you want:

If you are only interested in if there is a result, you should do this with SQL in the query and not with client code.

If you only want 1 row or no result, you could use QueryRow:

if err := db.QueryRow("SELECT id, name FROM users").Scan(&user); err == nil {
     // 1 row
} else if err == sql.ErrNoRows {
     // empty result
} else {
     // error
}

If you want multiple rows, you could do something like this (but nor really more elegant):

rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
     // error
}

if rows.Next() {
     // first row
     rows.Scan(&user)
     ...
} else {
     // empty result
}

for rows.Next() {
     // additional rows
     rows.Scan(&user)
}

Julien Schmidt

unread,
Nov 15, 2013, 12:59:34 PM11/15/13
to golan...@googlegroups.com, Jesse McNelis
Or a slightly cleaner variant for multiple rows:

rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
     // error
}

if rows.Next() {
     // first row
     rows.Scan(&user)
     ...

     // additional rows
     for rows.Next() {
         rows.Scan(&user)
         ...
     }
} else {
     // empty result
}


Tong Sun

unread,
Nov 15, 2013, 2:10:17 PM11/15/13
to Julien Schmidt, golang-nuts, Jesse McNelis

On Fri, Nov 15, 2013 at 12:59 PM, Julien Schmidt <g...@julienschmidt.com> wrote:
Or a slightly cleaner variant for multiple rows:

Super! Thanks!
Reply all
Reply to author
Forward
0 new messages