我使用下面的代碼有默認值,如果列具有空值。 PostgreSQL的版本:9.3pgsql中「Timestamp with zone」的默認值是什麼?
COALESCE(LastLoginTimestamp,'')
錯誤:
invalid input syntax for type timestamp with time zone: ""
我需要纔能有默認/空值,如果LastLoginTimestamp爲空做什麼。
我使用下面的代碼有默認值,如果列具有空值。 PostgreSQL的版本:9.3pgsql中「Timestamp with zone」的默認值是什麼?
COALESCE(LastLoginTimestamp,'')
錯誤:
invalid input syntax for type timestamp with time zone: ""
我需要纔能有默認/空值,如果LastLoginTimestamp爲空做什麼。
以下將情況返回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,'')
還有的''
爲時間戳沒有有效的解釋; CAST('' AS TIMESTAMP)
也會失敗。對於好的理由,''
是時間戳的廢話輸入,除了一個錯誤應該不會產生任何東西。
空字符串的這個想法被轉化爲默認值來來回回的MySQL和MyISAM在當天返回時沒有成交支持,因此MySQL能成功,不能失敗,因爲它不能回滾;彌補無效輸入的虛擬數據會更好。不用說,這不適用於PostgreSQL(或具有適當設置的現代MySQL)。
對於您的情況,如果沒有上次登錄,那麼LastLoginTimestamp
的確應該是NULL
。這是它的明智價值。如果你不能或不會做,由於某種原因,我建議使用特殊的時間戳值-infinity
。
COALESCE(LastLoginTimestamp, TIMESTAMP '-infinity')
'COALESCE'實際上不應該用於「default」,而是用於*「NULL」時,它應該是別的「* case。該*其他*不一定總是相同的,並且您並不總是需要將NULL轉換爲所謂的「默認」值。 'NULL'是通用狀態指示符,表示缺少值(*例如用戶從未在*之前登錄過)。你的程序應該檢查'null'並且適當地採取行動,而不是讓數據庫將'NULL'轉換成任意'默認'值。 – ADTC
有時您可能想將** NULL轉換爲其他用於**業務邏輯目的的**。在這種情況下,你可以使用'CURRENT_TIMESTAMP','NOW()','時間戳「-infinity''或其他任何這取決於最終目的的有效'timestamp'。 – ADTC