public inbox for [email protected]  
help / color / mirror / Atom feed
psql: print values and return the COUNT(*) value to bash?
3+ messages / 3 participants
[nested] [flat]

* psql: print values and return the COUNT(*) value to bash?
@ 2025-12-29 07:21 Ron Johnson <[email protected]>
  2025-12-29 08:12 ` Re: psql: print values and return the COUNT(*) value to bash? Jehan-Guillaume de Rorthais <[email protected]>
  2025-12-29 10:11 ` Re: psql: print values and return the COUNT(*) value to bash? hubert depesz lubaczewski <[email protected]>
  0 siblings, 2 replies; 3+ messages in thread

From: Ron Johnson @ 2025-12-29 07:21 UTC (permalink / raw)
  To: pgsql-general

Currently I do this in a bash script:
Tbl=table_1
Fld=field_1
Sql="SELECT CURRENT_TIMESTAMP - MIN($Fld) AS days_ago
          , MIN($Fld) as oldest_date
          , COUNT(*) AS cnt
     FROM $Tbl;"
psql -h <host> <db> -Xc "${Sql}"
 days_ago | oldest_date | cnt
----------+-------------+-----
          |             |   0
(1 row)

More stuff happens after this.  I want to print out these four lines, but
also test the COUNT(*) value and bypass other bash commands if the count ==
0.

Is there any relatively simple way to do this (psql print and return
count(*))?

-- 
Death to <Redacted>, and butter sauce.
Don't boil me, I'm still alive.
<Redacted> lobster!


^ permalink  raw  reply  [nested|flat] 3+ messages in thread

* Re: psql: print values and return the COUNT(*) value to bash?
  2025-12-29 07:21 psql: print values and return the COUNT(*) value to bash? Ron Johnson <[email protected]>
@ 2025-12-29 08:12 ` Jehan-Guillaume de Rorthais <[email protected]>
  1 sibling, 0 replies; 3+ messages in thread

From: Jehan-Guillaume de Rorthais @ 2025-12-29 08:12 UTC (permalink / raw)
  To: Ron Johnson <[email protected]>; +Cc: pgsql-general

On Mon, 29 Dec 2025 02:21:41 -0500
Ron Johnson <[email protected]> wrote:
…
> More stuff happens after this.  I want to print out these four lines, but
> also test the COUNT(*) value and bypass other bash commands if the count ==
> 0.

You should probably output your result from psql in a parsable way (CSV ? TSV ?
custom ?) for your bash script, then print values from bash. The commands
"column" or "printf" could help you format a pretty table if really needed.

> Is there any relatively simple way to do this (psql print and return
> count(*))?

Not in a clean way. To make psql return something else than 0, you need to
trigger an error with a failing query to make it return 3 when ON_ERROR_STOP is
enabled.






^ permalink  raw  reply  [nested|flat] 3+ messages in thread

* Re: psql: print values and return the COUNT(*) value to bash?
  2025-12-29 07:21 psql: print values and return the COUNT(*) value to bash? Ron Johnson <[email protected]>
@ 2025-12-29 10:11 ` hubert depesz lubaczewski <[email protected]>
  1 sibling, 0 replies; 3+ messages in thread

From: hubert depesz lubaczewski @ 2025-12-29 10:11 UTC (permalink / raw)
  To: Ron Johnson <[email protected]>; +Cc: pgsql-general

On Mon, Dec 29, 2025 at 02:21:41AM -0500, Ron Johnson wrote:
> Currently I do this in a bash script:
> Tbl=table_1
> Fld=field_1
> Sql="SELECT CURRENT_TIMESTAMP - MIN($Fld) AS days_ago
>           , MIN($Fld) as oldest_date
>           , COUNT(*) AS cnt
>      FROM $Tbl;"
> psql -h <host> <db> -Xc "${Sql}"
>  days_ago | oldest_date | cnt
> ----------+-------------+-----
>           |             |   0
> (1 row)
> 
> More stuff happens after this.  I want to print out these four lines, but
> also test the COUNT(*) value and bypass other bash commands if the count ==
> 0.
> 
> Is there any relatively simple way to do this (psql print and return
> count(*))?

1. Don't interpolate $variables to your sql. Instead use -v "t=$Tbl" -v
   "f=$Fld" options to psql, and then make your query use :"t" and :"f"
   - it's safer.

2. Catch output of the psql to variable, and check last line, there is
   rowcount there.

Example:

=$ cat z.sh
#!/usr/bin/env bash

table=pg_stat_all_tables
field=last_autovacuum

returned="$( psql -d depesz_explain -v "t=$table" -v "f=$field" -X << _SQL_
select current_timestamp - min(:"f") as days_ago
          , min(:"f") as oldest_date
          , count(*) as cnt
     from :"t"
_SQL_
)"
row_count="$( tail -n1 <<< "${returned}" | tr -cd 0-9 )"
echo "Rowcount = $row_count"
echo "Full output:"
echo "${returned}"

# vim: set filetype=bash shiftwidth=4 expandtab smarttab softtabstop=4 tabstop=4 textwidth=132 :

=$ bash z.sh
Rowcount = 1
Full output:
        days_ago        |          oldest_date          | cnt
------------------------+-------------------------------+-----
 7 days 03:48:07.348247 | 2025-12-22 07:22:32.593814+01 | 212
(1 row)

Best regards,

depesz







^ permalink  raw  reply  [nested|flat] 3+ messages in thread


end of thread, other threads:[~2025-12-29 10:11 UTC | newest]

Thread overview: 3+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2025-12-29 07:21 psql: print values and return the COUNT(*) value to bash? Ron Johnson <[email protected]>
2025-12-29 08:12 ` Jehan-Guillaume de Rorthais <[email protected]>
2025-12-29 10:11 ` hubert depesz lubaczewski <[email protected]>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox