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

时间:2019-05-09 00:16:13

标签: postgresql

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

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

也就是说,如果$ 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)||'$' 

1 个答案:

答案 0 :(得分:1)

未经测试,但我认为您可以使用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);