簡體   English   中英

根據其他列PSQL的值在SELECT語句中添加其他列

[英]Add additional column in a SELECT statement based on values of other columns PSQL

我有一張每人的駕駛執照表,並且知道一個人何時獲得了駕駛執照。 駕駛執照的有效期可以是您獲得駕照之日的X天,也可以是特定日期。

 acquired        relative      specific_date      valid_type     expiration_date
----------------------------------------------------------------------------------
2015-02-05         500             null              days
2015-02-05         null         2016-03-05           date
2015-02-05         200             null              days
2015-02-05         null         2016-02-22           date

我現在的查詢是:

SELECT acquired,
       relative_date,
       specific_date,
       valid_type
FROM person_drivers_license
WHERE (valid_type = 'days'
       AND (EXTRACT(epoch
                    FROM acquired) - EXTRACT(epoch
                                             FROM now()))/86400 + relative_date > 0)
  OR (valid_type = 'DATE'
      AND specific_date >= now()));

我正在嘗試使用上面的select語句添加expiration_date列。 如果是特定日期,則只需輸入日期並將其放在expiration_date中;如果是相對日期,則在獲取的日期的幫助下計算到期日期。 在PSQL中這可能嗎?

嘗試這個:

SELECT acquired,
       relative_date,
       specific_date,
       valid_type
       CASE valid_type
         WHEN 'days' THEN acquired + relative_date
         WHEN 'date' THEN specific_date
         ELSE NULL
       END AS expiration_date
FROM   person_drivers_license;

首先-在postgres中有一種更簡單的日期數學計算方法。 您可以使用類似:

acquired + relative_date * interval '1 day' >= current_date

要么

acquired + relative_date >= current_date 
-- any integer can be treated as interval in days for date mathematics is SQL

對於問題-嘗試以下一種方法:

CASE WHEN valid_type = 'days' 
     THEN acquired + relative_date * interval '1 day'
     WHEN valid_type = 'date'
     THEN specific_date
     --ELSE ??? you may specify something here
END

要么

COALESCE(specific_date, acquired + relative_date * interval '1 day')

該查詢可能類似於:

SELECT acquired,
       relative_date,
       specific_date,
       valid_type,
       COALESCE(specific_date, acquired + relative_date * interval '1 day') as valid_date
FROM person_drivers_license
WHERE COALESCE(specific_date, acquired + relative_date * interval '1 day') >= current_date

您不需要pl / sql

SELECT acquired,
       relative_date,
       specific_date,
       valid_type,
       CASE WHEN specific date = "date" -- starts here
       THEN specific date 
       ELSE acquired + cast('1 months' as interval)END 
       AS expiration_date -- end here
FROM person_drivers_license
WHERE (valid_type = 'days'
       AND (EXTRACT(epoch
                    FROM acquired) - EXTRACT(epoch
                                             FROM now()))/86400 + relative_date > 0)
  OR (valid_type = 'DATE'
      AND specific_date >= now()));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM