2015-09-06 78 views
3

我在Netezza下面的查詢運行,並得到提及的錯誤。錯誤的時間戳外部表示錯誤在Netezza

查詢:

SELECT * FROM WORKORDER SRC 
    INNER JOIN APPOINTMENT TRG 
     ON SRC.ACCESSID = TRG.SEEKER_ID 
     AND (COALESCE(SRC.SLAEXPIRY, '') = COALESCE(TRG.SLA_EXPIRY_DATE_TS, '')) 

錯誤:

ERROR [HY000] ERROR: Bad timestamp external representation '' 

我可以看到有時NULLSLAEXPIRYSLA_EXPIRY_DATE_TS列嘗試以下選項,沒有運氣雖然

SELECT * FROM WORKORDER SRC 
    INNER JOIN APPOINTMENT TRG 
     ON SRC.ACCESSID = TRG.SEEKER_ID 
     AND case when COALESCE(SRC.SLAEXPIRY, '') is not null then COALESCE(SRC.SLAEXPIRY, '') 
          else NULL end = case when COALESCE(TRG.SLA_EXPIRY_DATE_TS, '') is not null then COALESCE(TRG.SLA_EXPIRY_DATE_TS, '') 
              else NULL end 
+0

我相信有一個默認值是傳遞給你的時間戳列。而不是通過空間嘗試傳遞'00 -00-00 00:00:00' – Abhis

+0

@Abhis,不幸的是在這一點上,我必須忍受現有的數據。目前在這個列中有'NULL'值 – SMPH

+0

@Ahhis,我嘗試了你的解決方案,然後得到了'ERROR [HY000] ERROR:錯誤的時間戳外部表示'00 -00-00 00:00:00'' – SMPH

回答

1

的根本問題在於空字符串(即'')不能轉換爲時間戳。

TESTDB.ADMIN(ADMIN)=> select coalesce(current_timestamp, ''); 
ERROR: Bad timestamp external representation '' 

第二個問題當然是NULL不加入。無論如何,如果你想加入NULL,下面的查詢應該適合你。不要期望這種基於表達式的連接有很好的性能。

SELECT * 
FROM WORKORDER SRC 
    INNER JOIN APPOINTMENT TRG 
    ON SRC.ACCESSID = TRG.SEEKER_ID 
    AND 
     (
     (
      SRC.SLAEXPIRY = TRG.SLA_EXPIRY_DATE_TS 
     ) 
     OR 
     (
      SRC.SLAEXPIRY   IS NULL 
     AND TRG.SLA_EXPIRY_DATE_TS IS NULL 
     ) 
    ) 
+0

你也可以使用'isnotfalse()'或'istrue()'函數將null與null進行比較。 –