2013-10-09 59 views
4

我正在運行一個非常簡單的查詢,但是對於某些結果,一個字段中的值爲空。如果它的值爲空,我怎樣才能將該值設置爲「一個字符串」?當值爲空時,在查詢中設置默認值

喜歡的東西

SELECT RegName, 
    RegEmail, 
    RegPhone, 
    RegOrg, 
    RegCountry, 
    DateReg, 
    (Website IS NULL? 'no website' : Website) AS WebSite 
FROM RegTakePart 
WHERE Reject IS NULL 

這將在SQL Server上運行2005

感謝

+1

看那'ISNULL'或'COALESCE'功能。 –

+0

謝謝大家,如果您遷移到MySQL,我會盡快接受答案 –

回答

15

使用以下命令:

SELECT RegName, 
     RegEmail, 
     RegPhone, 
     RegOrg, 
     RegCountry, 
     DateReg, 
     ISNULL(Website,'no website') AS WebSite 
FROM RegTakePart 
WHERE Reject IS NULL 

或者,@Lieven指出:

SELECT RegName, 
     RegEmail, 
     RegPhone, 
     RegOrg, 
     RegCountry, 
     DateReg, 
     COALESCE(Website,'no website') AS WebSite 
FROM RegTakePart 
WHERE Reject IS NULL 

COALESCE的動態是,你可以定義更多的參數,因此,如果第一個是null,則獲得第二,如果第二個是空獲得第三等等...

+0

與ISNULL。 sintax有不同的 http://www.w3schools.com/sql/sql_isnull.asp –

+0

與這個例子不相關,但仍值得注意的是,COALESCE的缺點是它擴展爲case語句,因此'COALESCE(( SELECT COL FROM T),'No Value')',擴展爲'CASE WHEN(SELECT COLOR T)NOT NOT THEN(SELECT Something FROM Table)ELSE'無值'END',表示子查詢被執行兩次,如果結果不爲null。 ISNULL不會出現這種行爲。合併的好處在於它在ANSII標準中,ISNULL()不是。 – GarethD

1

你只需要使用ISNULL(website, 'yourstring')

所以,您的查詢就會像:

SELECT RegName, 
    RegEmail, 
    RegPhone, 
    RegOrg, 
    RegCountry, 
    DateReg, 
    ISNULL(website, 'no website') AS WebSite 
FROM RegTakePart 
WHERE Reject IS NULL 
+0

不管你選擇什麼答案,他們都會工作。 'COALESCE'和'ISNULL'都是解決方案。 –

3

使用CASE

SELECT regname, 
     regemail, 
     regphone, 
     regorg, 
     regcountry, 
     datereg, 
     CASE 
     WHEN website IS NULL THEN 'no website' 
     ELSE website 
     END AS WebSite 
FROM regtakepart 
WHERE reject IS NULL 

COALESCE

.... 
COALESCE(website, 'no website') AS WebSite 
.... 
2

如上所述,聚結溶液是優選的。作爲一個額外的好處,你可以使用聚結對「派生出來的」值與所選值,如下所示:

SELECT 
     {stuff}, 
     COALESCE((select count(*) from tbl where {stuff}), 0) AS countofstuff 
FROM 
     tbl 
WHERE 
     {something} 

使用「IIF」或「案例」,您將需要重複內聯,而與你COALESCE不,它可以讓你避免在返回一個「空」的結果......

+0

用'()包裹'COALESCE'的第一個參數非常重要,否則查詢將無法編譯。這次真是萬分感謝 –

0

爲了避免一些問題,其他用戶:

問題1 +解決方案:

如果您計劃使用ISNULL功能與Access數據庫一起使用,請注意Access中實現的ISNULL函數與SQL Server實現有所不同。

訪問ISNULL函數總是返回TRUEFALSE。 因此,您必須使用圍繞ISNULL用法的自定義IIF函數。

問題2 +解決方案:

而且,如果你想使用相同的字段名稱,別名爲您列,這可能會導致Jet數據庫引擎告訴你,有一個「循環引用「到現場。

因此,如果您需要使用與Alias相同的字段名稱,則只需在字段名稱前添加表名。 (例如:您必須使用RegTakePart.Website而不是簡單的Website)。這樣,您可以自由使用Website作爲列的別名。

全局工作(和測試)SQL查詢來避免這些問題2在下列之一:

SELECT RegName, 
    RegEmail, 
    RegPhone, 
    RegOrg, 
    RegCountry, 
    DateReg, 
    IIF(RegTakePart.Website IS NULL, 'no website, RegTakePart.Website) AS Website 
FROM RegTakePart 
WHERE Reject IS NULL