2015-04-12 77 views
0

我目前有一個表,我想用select語句修改。SQL DB2查詢語法問題

我想選擇一個空行並將其與下面的代碼中可以看到的另一個表組合。

第一個選擇語句是錯誤的,因爲它只需要爲一行而不是全部執行此操作。或以某種方式添加一個空行,而不必一個值添加到表

而且下面的代碼引發此錯誤:在 功能「DECFLOAT」的字符串參數發現

SQL0420N無效字符。 SQLSTATE = 22018

代碼:

select ' ' as RD_E_SUP, \ 
     ' ' as RD_E_EMP, \ 
     ' ' as RD_QUOT \ 
from RD_SUPERVISOR \ 
    \ 
UNION \ 
     \ 
select RD_E_SUP, \ 
     RD_E_EMP, \ 
     'null' as RD_QUOT \ 
from RD_SUPERVISOR \ 
ORDER BY RD_E_EMP 
+0

爲什麼你在每行的結尾都有\?這絕對是無效的(標準)SQL。 –

回答

2

你的第一個子查詢不是從表RD_SUPERVISOR繪製任何東西,所以從該表中選擇的唯一原因是,如果你沒有要爲每行一個結果桌子。既然你要不管表RD_SUPERVISOR的內容只有一個行中,有一個特殊的表,你可以從只是目的選擇:

select ' ' as RD_E_SUP, 
    ' ' as RD_E_EMP, 
    ' ' as RD_QUOT 
from SYSIBM.SYSDUMMY1 

在一些其他DBMS,您可以通過選擇達到同樣的效果「DUAL」,或者完全省略FROM子句。

鑑於第一個子查詢產生的行不能複製第二個產生的行,因此UNION ALL將是比UNION更好的選擇。如果要從第二個子查詢的結果中刪除重複項,則應在該子查詢中使用SELECT DISTINCT

請注意,' ''null'都不會與NULL相同。這不一定是一個問題,但如果你有不同的想法,那麼你的查詢並不意味着你認爲它的意思。

SQL0420N錯誤可能意味着DB2正在嘗試(和失敗)將其中一個空字符串(' ')轉換爲DECFLOAT類型。如果它爲整個結果的列RD_E_SUPRD_E_EMP選擇該類型,則可能會這樣做,可能是因爲它是第二個子查詢中該列的類型。要解決該問題,您應該確保通過一個或兩個選擇列表中的顯式類型轉換,使子查詢選擇的相應列的數據類型相同。

+0

如果在SQL db2中打印一個被視爲空行的新行,是否可能? – geforce

+0

另外,有沒有辦法讓表格打印'null'而不是' - '?這就是爲什麼我試圖使用引發錯誤的'null' – geforce

+2

@GeForce - _printing_「null」是一個格式化/顯示問題,並且不屬於數據庫(而是在您的報告應用程序中) - 對於這個問題,這是一個技術/計算機術語,你最好選擇你的用戶/客戶/客戶對該領域的期望(比如「N/A」)。 –