PostgreSQL Bash脚本判断查询结果是否为空问题求助
解决你的PostgreSQL+Bash脚本问题
我来帮你修复这两个问题,先拆解一下问题根源,再给出优化后的脚本:
问题分析
- 为什么会返回查询结果而非1/0:你原来的
SELECT *会把所有匹配的行都输出,导致valuesFound变量里存了这些行数据,而不是你想要的判断结果。 - IF语句语法错误:
@@ROWCOUNT是SQL Server的专属语法,PostgreSQL并不支持;而且直接在psql交互模式下写IF属于PL/pgSQL的控制结构,不能直接这么用,得用纯SQL的方式实现判断逻辑。
修复后的脚本
#!/bin/sh DATABASE=dbname USERNAME=user HOSTNAME=somehost.com export PGPASSWORD=password queryResult () { # 使用-t去掉表头,-A取消对齐格式,确保输出只有纯数字 psql -h "$HOSTNAME" -U "$USERNAME" -d "$DATABASE" -t -A <<SQL SELECT CASE WHEN EXISTS( SELECT 1 FROM myTable WHERE valueA > 5.0 OR valueB > 5.0 ) THEN 1 ELSE 0 END; SQL } valuesFound=$(queryResult) echo "$valuesFound"
关键改进点
- 用
EXISTS替代SELECT *:EXISTS只检查是否存在匹配的行,不会返回实际数据,效率更高,而且正好符合你“判断是否有行返回”的需求。 - 用SQL的
CASE语句返回1/0:不需要用PL/pgSQL的IF,直接用纯SQL就能实现条件判断并输出数字结果。 - 添加
psql参数优化输出:-t会去掉默认的表头,-A会取消列对齐的空格,确保输出的只有1或0,没有多余字符。 - 变量加双引号:比如
"$HOSTNAME",避免当变量值包含特殊字符或空格时出现错误。
内容的提问来源于stack exchange,提问作者user-2147482428
相关产品推荐
相关产品推荐

