2011-07-06 27 views
2

我有兩個表,一個用於個人,另一個用於他們的公司。MySql中的ISNULL函數中的兩列

每個表都有一個locale列,這對公司是強制性的,但對個人來說不是強制性的。這個想法似乎是,如果個人沒有設定偏好,他們會被假定爲在他們公司的地區。

我想選擇個別的區域設置,使用默認的公司,如果個別區域設置爲空,我認爲做以下(這我不認爲是在MySQL可能)的...

SELECT 
    ISNULL(individual.Locale, company.Locale) `Locale` 
FROM 
    individual 
INNER JOIN 
    company ON company.CompanyId = individual.CompanyId 
WHERE 
    individual.IndividualId = 1 

是否有一個很好的方法來做到這一點 - 或者我只是最終將兩個Locale的背部發送並在代碼中作出決定?

回答

4

可以使用COALESCE()函數返回它的參數中的第一個非NULL值。這個功能也可以在其他大多數RDBMS使用像SQL-ServerOracle 9Postgres 8

SELECT 
    COALESCE(individual.Locale, company.Locale) AS Locale 
FROM 
    individual 
INNER JOIN 
    company ON company.CompanyId = individual.CompanyId 
WHERE 
    individual.IndividualId = 1 
3

你幾乎有它,你想要的是IFNULL()

SELECT 
    IFNULL(individual.Locale, company.Locale) `Locale` 
FROM 
    individual 
INNER JOIN 
    company ON company.CompanyId = individual.CompanyId 
WHERE 
    individual.IndividualId = 1 
+0

+1,因爲這是一個偉大的答案 - 我與COALESCE走到底,因爲它會在其他數據庫工作太和除非您將其用作子查詢的一部分,否則它會執行相同的操作。 – Fenton

+0

不錯的選擇。我今天也學到了一些東西:) –

2

嘗試CASE...WHEN...THEN聲明

SELECT 
    (CASE 
     WHEN individual.Locale IS NULL THEN company.Locale 
     ELSE individual.Locale 
    END) 'Locale' 
FROM 
    individual 
INNER JOIN 
    company ON company.CompanyId = individual.CompanyId 
WHERE 
    individual.IndividualId = 1 
+0

這個不行,把它改成:'CASE WHEN individual.Locale IS NULL THEN ...' –

+0

ure right,did not checked:| – VAShhh

+0

是的,因爲'CASE表達WHEN'檢查是否相等,而'NULL = NULL'不是'True'(不幸:) –