我正在构建一个Web应用程序,我注意到我的一个查询返回的是null,而我期望的是boolean.然而,数据库显示它实际上返回的是boolean.

我可以在documentation中看到,Postgres认为NULL是一个未知的布尔值.我搞不懂为什么<=运算符会返回t/NULL,而不是t/f.

select version();
version
PostgreSQL 13.13 (Debian 13.13-0+deb11u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
SELECT a.email_verified_at <= NOW() AS "emailVerified",
 pg_typeof(a.email_verified_at <= NOW()) AS "emailVerifiedType", 
 pg_typeof((a.email_verified_at <= NOW())::boolean) AS "emailVerifiedType2" 
FROM profiles AS p 
INNER JOIN accounts AS a ON p.id = a.profile_id;
emailVerified emailVerifiedType emailVerifiedType2
boolean boolean
t boolean boolean
boolean boolean

我如何告诉Postgres将显式的t/f返回给我的应用程序?

推荐答案

SQL有一个三值逻辑:布尔表达式可以是TRUEFALSE或NULL(未知).如果将NULL(未知)与任意值进行比较,则结果为NULL.

有几种方法可以重写比较,以便在email_verified_at为空值时返回FALSE:

  1. 使用coalesce():

    coalesce(email_verified_at, 'infinity') <= current_timestamp
    
  2. 使用显式空值判断

    email_verified_at IS NOT NULL AND email_verified_at <= current_timestamp
    

另一种 Select 是,如果邮箱地址从未经过验证,则禁止在email_verified_at和存储infinity中使用空值.这种解决方案将简化比较,但由于其他原因,它可能是不可取的.

Postgresql相关问答推荐

Postgres:如何优化在多个表上搜索列的相似性查询?(Pg_Trgm)

无法在timscaleDb中创建Hypertable

时间戳的postgreSQL-to_char如果为零,则不显示微秒

包含间隔在 jooq 和 postgres 中没有按预期工作

AWS RDS 公开访问

UPDATE implies move across partitions

如何使用 ActiveRecord json 字段类型

是否有 postgres CLOSEST 运算符?

Postgres COPY FROM csv file-No such file or directory

在 postgres 中删除所有共享相同前缀的表

PostgreSQL ,从 2 个表中 Select ,但仅从表 2 中 Select 最新的元素

是否可以在 Postgres 中存储一个 1 字节的数字?

如何正确索引多对多关联表?

如何语法判断 PostgreSQL 配置文件?

大型查询后 psycopg2 泄漏内存

PostgreSQL 使用 UUID 与文本作为主键

如何在postgresql中编写关于最大行数的约束?

性能调优:为布尔列创建索引

如何在 PostgreSQL 中获取数组的最后一个元素?

PostgreSQL 中 from dual 的等价性