2014-04-23 64 views
4

我有一个2字段的表,val1val2,包含相同的类型。 val1是强制性的,val2是可选的 - 但如果存在的话,应该计为多达val1选择不同的字段作为一个字段(没有CONCAT)

CREATE TABLE VALS (
id INT NOT NULL AUTO_INCREMENT, 
val1 INT NOT NULL, 
val2 INT DEFAULT NULL, 
timesign TIMESTAMP); 

对于这一点,我想要检索的所有值,无论是从val1val2场来,进入一个领域res,使这一

INSERT INTO VALS (val1, val2) VALUES 
(1, null), 
(2, null), 
(3, 4), 
(5, null), 
(6, 7), 
(8, null); 

可以检索到只有一个字段:

+------+ 
| res | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
+------+ 

如何做到这一点?

回答

4

试试这个:

SELECT val1 as res 
FROM VALS 

UNION 

SELECT val2 as res 
FROM VALS 
WHERE val2 is notNULL; 

你不需要 “DISTICT”,联盟本身就给设置。与工会

SELECT a AS f FROM t 
UNION 
SELECT b AS f FROM t HAVING f IS NOT NULL ORDER BY f 

作品

+1

[**小提琴演示**](http://www.sqlfiddle.com/#!2/73103/ 1)为你 –

+1

@MKhalidJunaid我很惊讶你做演示的速度有多快。魔术是什么? - 谢谢! –

+0

当第一列'null'且第二列不是'null'时不起作用。如果你需要的话,你可能会看到我的解决方案(非常相似,但使用别名列) –

1

试试这个:

select resultcol from (select distict val1 as resultcol from vals union select distinct val2 as resultcol from vals)alias order by resultcol 

联盟中删除所有重复值

3

一个查询时,两个柱可以是NULL

+0

根据表definiton第一列被指定非空 –

+0

是的,你的建议是有帮助的否则我使用'不是';'两个地方。 –

+0

@mhasan并不意味着它不会工作 –

相关问题