2010-06-28 33 views
1

我想在我的MYSQL数据库上运行一个查询。我正在搜索的表有一个file_type字段,它将是三个值之一(1,2,3)。根据这些值我想从数据库中查找不同的信息。因此,例如,如果'file_type'字段是1或2,那么我想要选择字段a,b,c,d 但是,如果我注意到file_type = 3,那么我想选择字段a,b,c ,d,e,fSELECT子句:可选列?

这可以在单个SELECT语句中完成吗?这样的 - ISH

my_simple_query = SELECT file_type,a,b,c,d FROM table1 
my_new_query = SELECT file_type,a,b,c,d (AND e,f IF file_type = 3) FROM table1 

感谢所有

--------------------------------- - ADDITION -----------------------------------

而我该怎么做,如果e, f被存储在另一个表中?

my_multitable_query = SELECT file_type,id,a,b,c,d (AND e,f FROM table2 WHERE id=id) FROM table1 

让我的漂移?

回答

3

如果您需要非关系数据,您可能更喜欢使用非关系数据库,如CouchDBMongoDB

在SQL中,您必须在编写查询时声明所有列。所有这些列必须出现在结果集的每一行;该列的集合不能根据每行中的内容而变化。这实际上就是作为关系数据库的定义(以及每一列在每一行上都具有相同类型的要求)。


关于你的另一个问题,这可能是一些进展:

SELECT t1.file_type, t1.a, t1.b, t1.c, t1.d, t2.e, t2.f 
FROM table1 t1 
LEFT OUTER JOIN table2 ON t1.id=t2.id; 

你仍然得到列E和F的结果集的每一行,即使它们是空,因为有table1中的给定行在table2中不匹配。

这导致你一个叫Class Table Inheritance的模式。

+0

好的谢谢 - 那么我会忍受长选择语句,我试图让事情更有效一些,只有在需要时才返回某些字段。非常感谢您的回应 – undefined 2010-06-28 16:09:22

5

不,SQL SELECT语句不支持可选列。

但是你可以指定逻辑基于标准只返回值,否则就为null:

SELECT a,b,c,d, 
     CASE WHEN file_type = 3 THEN t2.e ELSE NULL END AS e, 
     CASE WHEN file_type = 3 THEN t2.f ELSE NULL END AS f 
    FROM TABLE_1 t1 
    JOIN TABLE_2 t2 ON t2.id = t1.id 
0

不熟悉MySQL的,但为什么不使用UNION

> SELECT file_type,a,b,c,d FROM table1 WHERE file_type in (1,2) 
> UNION 
> SELECT file_type,a,b,c,d,e,f FROM table1 WHERE file_type = 3 
+0

只有在两个表中使用相同数量的列时,UNION才能工作。此外,在这种情况下,您将使用UNION,因为查询是互斥的,UNION ALL会更快。 – HLGEM 2010-06-28 17:51:29

+0

对,我忘了,没有测试我的陈述。 在第一个“SELECT”中添加“null,null”,这就是我通常所做的... re:'UNION ALL' ...真的吗? 我从不打扰它看;我认为这通常是某种合成糖...... – pascal 2010-06-29 05:59:12