2011-12-02 107 views
3

我正在返回一個包含名稱,課程和課程代碼的查詢,但課程代碼爲空的位置我想顯示「NOT ENROLLED」。 我可以通過使用'默認'來做到這一點嗎? SELECT語句來自一個VIEW會有什麼不同。如何顯示消息而不是NULL

CREATE VIEW STUDENT_LIST 
(studentname, dateofbirth, coursecode) 
AS 
SELECT COURSECODE, STUDENTNAME, DATEOFBIRTH 
FROM STUDENT; 

SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,"NOT_ENROLLED") 
FROM STUDENT_LIST; 

我得到的回覆未註冊無效的......我不帶引號 我使用的是Oracle都試過了。

+0

請提供更多詳情;例如,select語句的興趣會有所幫助。 – jzila

+0

還有你正在使用的DBMS。正如@ user983064指出的那樣,不同的實現有不同的空合併函數。 –

+0

你使用什麼形式的SQL? sql-server/mysql? –

回答

2

甲骨文已經NVL()

SQL Server有ISNULL()

MySQL有IFNULL()

以上和PostgreSQL的支持COALESCE()的全部。

所以,

SELECT STUDENTNAME, 
     DATEOFBIRTH, 
     NVL(COURSECODE,'NOT_ENROLLED') 
FROM STUDENT_LIST; 

SELECT STUDENTNAME, 
     DATEOFBIRTH, 
     COALESCE(COURSECODE,'NOT_ENROLLED') 
FROM STUDENT_LIST; 
在甲骨文

+0

每次我運行SELECT DATEOFBIRTH,COURSECODE,STUDENTNAME表中的字段所有換行符,dateofbirth結束了姓名,coursecode是日期,studentname是代碼。 – StudentRik

+0

@StudentRik聽起來很奇怪,你的意思是他們在你的結果中顯示的順序與你選擇的順序不同嗎? – Bert

+0

我可以像普通表一樣放下視圖表並重試嗎? – StudentRik

1

使用nvl。不同的實現可能會有所不同對於你想要的MySQL而言。

+0

是的,我想過。謝謝你會嘗試。 – StudentRik

0

如果您使用的是mySql,那麼是的!你可以爲NULL設置一個默認值。並且每當一個值將不會被保存在數據庫中時。

3
SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,"NOT_ENROLLED") FROM STUDENT_LIST; 

我得到的回覆未註冊無效的......我試圖 不,我使用的是Oracle的報價。

這是因爲您在NOT_ENROLLED周圍使用了雙引號。在Oracle中,你使用單引號圍繞字符串文字。雙引號分隔可能具有嵌入空格的標識符,因此Oracle認爲NOT_ENROLLED是標識符,而不是字符串文字。

使用此:

SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,'NOT_ENROLLED') FROM STUDENT_LIST; 
+0

好的謝謝你,但列名不匹配列時,我交換選擇語句的順序所有列交換輪以及(哈哈)我想複製我開始視圖的順序。 – StudentRik

0

爲了避免未註冊無效的答覆,你應該用單引號代替雙引號:

取代:

SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,"NOT_ENROLLED") 
FROM STUDENT_LIST; 

由:

SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,'NOT_ENROLLED') 
FROM STUDENT_LIST; 

對於Oracle,雙引號用於列或表標識符(例如包含空格:「總項目」)

0

此處未涉及的問題的一個方面是我們只考慮了輸入文本的一般情況「顯示消息「在表中的char字段中。

如果它說一個不同的數字字段,例如DOB ...在這種情況下我們把使用TO_CHAR和救場,否則我們會給出錯誤的無效輸入

SELECT e.studentname, NVL(TO_CHAR(e.dateofbirth),'PLS Contact admin to update'), NVL(e.COURSECODE,'NOT_ENROLLED') 
FROM STUDENT_LIST e; 

這將保存的文本,否則會導致錯誤的號碼字段。