2016-04-30 26 views
2

自從我嘗試創建此MySQL視圖後,我的頭痛已經開始,其中一列的結果值爲NULL。我需要有一個真實的值,而不是0。MySQL查看列爲NULL的位置

我把我的ID從table1和比較它在table2,所以它不知道有一個號碼與該ID,如果沒有數字在表2中的值將變成NULL,而我需要0代替。這裏不用我的代碼的觀點:

CREATE VIEW `instock` AS 
SELECT 
    table1.name AS name, 
    table1.supl AS supply, 
    table2.num AS numbers, 
    table1.maxnum AS maxnumbers 
FROM 
    (table1 
    LEFT JOIN table2 ON ((table1.id = table2.id))) 
ORDER BY table1.name 

其列號在那裏我有一個NULL值

+0

嘗試'COALESCE(table2.num,0)作爲numbers'。 [COALESCE](http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce)將返回'0'而不是'NULL'。 – PerlDuck

+0

謝謝,我從來沒有聽說過這個命令,但它確實做到了這一招!此主題已解決 – Kingfox

+1

另一個選項是[IFNULL](http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_ifnull):即'IFNULL(table2.num, 0)作爲數字。 – PerlDuck

回答

1

我不知道查詢中您的left join。 A left join給出全部表(table1)包括在另一個表(table2)中沒有對應表的那些行。對於右表中的這些不匹配的行,對於所有table2的列,您將得到NULL,包括table2.num

也許您正在查找inner join。這取決於您的數據以及您的table2.num是否無效。只需更換用零的NULL,使用COALESCE

CREATE VIEW `instock` AS 
SELECT 
    table1.name AS name, 
    table1.supl AS supply, 
    COALESCE(table2.num,0) AS numbers, 
    table1.maxnum AS maxnumbers 
FROM 
    (table1 
    LEFT JOIN table2 ON ((table1.id = table2.id))) 
ORDER BY table1.name 

或者IFNULL

CREATE VIEW `instock` AS 
SELECT 
    table1.name AS name, 
    table1.supl AS supply, 
    IFNULL(table2.num,0) AS numbers, 
    table1.maxnum AS maxnumbers 
FROM 
    (table1 
    LEFT JOIN table2 ON ((table1.id = table2.id))) 
ORDER BY table1.name 

如果你想從table2完全跳過項目不在table1(WRT。ID字段),你可以使用一個inner join

CREATE VIEW `instock` AS 
SELECT 
    table1.name AS name, 
    table1.supl AS supply, 
    table2.num AS numbers, 
    table1.maxnum AS maxnumbers 
FROM 
    (table1 
    INNER JOIN table2 ON ((table1.id = table2.id))) 
ORDER BY table1.name 

再次:這取決於您的需求。 IFNULL/COALESCE將顯示0而不是NULL,INNER JOIN將完全跳過這些行。

(有疑問時,我總是指this explanation on joins。這是值得一薄荷)

1

您可以使用IFNULL功能:

SELECT 
    table1.name AS name, 
    table1.supl AS supply, 
    ifnull(table2.num,0) AS numbers, 
    table1.maxnum AS maxnumbers 
FROM 
    (table1 
    LEFT JOIN table2 ON ((table1.id = table2.id))) 
ORDER BY table1.name