如何在sql查询(PostgreSQL)中管理空字符串或日期

如何在sql查询(PostgreSQL)中管理空字符串或日期,postgresql,Postgresql,PostgreSQL 11.1 对于下面的sql查询,其中$1和$2是字符串,$3是时间戳,如何重写下面的查询,以便$3中的空值允许选择每个日期(不仅仅是空日期) 也就是说,如果$3为空,则应减少为: SELECT lastname, firstname, birthdate FROM patients WHERE UPPER(lastname) LIKE UPPER($1)||'%' and UPPER(firstname) LIKE UPPER($2)||'%

PostgreSQL 11.1 对于下面的sql查询,其中$1和$2是字符串,$3是时间戳,如何重写下面的查询,以便$3中的空值允许选择每个日期(不仅仅是空日期)

也就是说,如果$3为空,则应减少为:

SELECT lastname, firstname, birthdate FROM patients 
               WHERE UPPER(lastname) LIKE UPPER($1)||'%' and UPPER(firstname) LIKE UPPER($2)||'%' 
            UNION
            SELECT lastname, firstname, birthdate FROM appointment_book 
               WHERE UPPER(lastname) LIKE UPPER($1)||'%' and UPPER(firstname) LIKE UPPER($2)||'$' 

未经测试,但我认为您可以使用
CASE
表达式处理此问题

SELECT lastname, firstname, birthdate FROM patients p
  WHERE UPPER(p.lastname) LIKE UPPER($1)||'%'
  AND   UPPER(p.firstname) LIKE UPPER($2)||'%'
  AND   (CASE WHEN $3 IS NULL THEN TRUE
         ELSE                      p.birthdate::date = $3::date
         END)
UNION
SELECT lastname, firstname, birthdate FROM appointment_book ab
  WHERE UPPER(ab.lastname) LIKE UPPER($1)||'%'
  AND   UPPER(ab.firstname) LIKE UPPER($2)||'%'
  AND   (CASE WHEN $3 IS NULL THEN TRUE
         ELSE                      ab.birthdate::date = $3::date
         END);
SELECT lastname, firstname, birthdate FROM patients p
  WHERE UPPER(p.lastname) LIKE UPPER($1)||'%'
  AND   UPPER(p.firstname) LIKE UPPER($2)||'%'
  AND   (CASE WHEN $3 IS NULL THEN TRUE
         ELSE                      p.birthdate::date = $3::date
         END)
UNION
SELECT lastname, firstname, birthdate FROM appointment_book ab
  WHERE UPPER(ab.lastname) LIKE UPPER($1)||'%'
  AND   UPPER(ab.firstname) LIKE UPPER($2)||'%'
  AND   (CASE WHEN $3 IS NULL THEN TRUE
         ELSE                      ab.birthdate::date = $3::date
         END);