2015-12-21 60 views
0

我有一个表:如何在select中过滤空值?

DataTable: 
id int, 
user_id int, 
field_id int, 
value varchar 

DataExample:

id user_id field_id value 
1  1   1  'Peter' 
2  1   2  56 
3  1   3  100 
4  2   1  'Buzz' 
5  2   2  47 
6  2   3  120 
7  3   1  'Wolf' 
8  3   2  null 
9  3   3  null 

我想field_id财产来分隔值列:

Name Age  Score 
Peter 56  100 
Buzz 47  120 

我做的:

SELECT id, MAX(Name) AS Name, MAX(Age) AS Age, MAX(Score) AS Score 
FROM (
SELECT u.id 
CASE 
    WHEN field_id = 1 THEN value 
END as Name, 
CASE 
    WHEN field_id = 2 THEN value 
END as Age, 
CASE 
    WHEN field_id = 3 THEN value 
END as Score 
FROM Users u 
INNER JOIN DataTable t ON (t.user_id=u.id) 
) AS sub 
GROUP BY id; 

这是很好的作品。但现在我想过滤空值。我的意思是我不想选择AgeScore = null。我尝试在CASE块中添加is not null,但它没有帮助。
任何建议?

+0

尝试'ifnull()'。一探究竟。 – MaxPD

+0

为什么在CASE块?你忘了'WHERE'吗? – i486

+0

请问您可以使用NULL将行添加到数据示例并显示它将如何影响输出? – Uriil

回答

2

做一个双自联接:

select t1.value as name, t2.value as Age, t3.value as Score 
from (select userid, value from DataTable where field_id = 1) as t1 
join (select userid, value from DataTable where field_id = 2) as t2 ON t1.userid = t2.userid 
join (select userid, value from DataTable where field_id = 3) as t3 ON t1.userid = t3.userid 

第一个子查询返回的名字,第二个返回年龄和第三得分。

+0

它的作品!谢啦。 –

+0

不客气! – jarlh

0
SELECT id, MAX(Name) AS Name, MAX(Age) AS Age, MAX(Score) AS Score 
FROM (
SELECT u.id 
CASE 
    WHEN field_id = 1 THEN value 
END as Name, 
CASE 
    WHEN field_id = 2 THEN value 
END as Age, 
CASE 
    WHEN field_id = 3 THEN value 
END as Score 
FROM Users u 
INNER JOIN DataTable t ON (t.user_id=u.id) 
    WHERE value IS NOT NULL -------------------here 
) AS sub 
GROUP BY id; 
+0

我仍然得到一个空值, –

+1

然后检查该字段是否为空而不是NULL – MaxPD