2014-01-27 27 views
0

我使用下面的代碼有默認值,如果列具有空值。 PostgreSQL的版本:9.3pgsql中「Timestamp with zone」的默認值是什麼?

COALESCE(LastLoginTimestamp,'') 

錯誤:

invalid input syntax for type timestamp with time zone: "" 

我需要纔能有默認/空值,如果LastLoginTimestamp爲空做什麼。

+0

'COALESCE'實際上不應該用於「default」,而是用於*「NULL」時,它應該是別的「* case。該*其他*不一定總是相同的,並且您並不總是需要將NULL轉換爲所謂的「默認」值。 'NULL'是通用狀態指示符,表示缺少值(*例如用戶從未在*之前登錄過)。你的程序應該檢查'null'並且適當地採取行動,而不是讓數據庫將'NULL'轉換成任意'默認'值。 – ADTC

+0

有時您可能想將** NULL轉換爲其他用於**業務邏輯目的的**。在這種情況下,你可以使用'CURRENT_TIMESTAMP','NOW()','時間戳「-infinity''或其他任何這取決於最終目的的有效'timestamp'。 – ADTC

回答

0

以下將情況返回1900-01-01爲timestamp with time zone時​​3210第一個參數(LastLoginTimestamp)是null

coalesce(LastLoginTimestamp,cast('1900-01-01' as timestamp with time zone)) 

你的嘗試失敗,因爲PostgreSQL並不知道你的意思timestamp類型由''。默認情況下,PostgreSQL將假設''是文本:

select coalesce(null,'') 
2

還有的''爲時間戳沒有有效的解釋; CAST('' AS TIMESTAMP)也會失敗。對於好的理由,''是時間戳的廢話輸入,除了一個錯誤應該不會產生任何東西。

空字符串的這個想法被轉化爲默認值來來回回的MySQL和MyISAM在當天返回時沒有成交支持,因此MySQL能成功,不能失敗,因爲它不能回滾;彌補無效輸入的虛擬數據會更好。不用說,這不適用於PostgreSQL(或具有適當設置的現代MySQL)。

對於您的情況,如果沒有上次登錄,那麼LastLoginTimestamp的確應該是NULL。這是它的明智價值。如果你不能或不會做,由於某種原因,我建議使用特殊的時間戳值-infinity

COALESCE(LastLoginTimestamp, TIMESTAMP '-infinity') 
相關問題