SELECT子句:可选列?

时间:2010-06-28 16:00:33

标签: sql mysql

我想在我的MYSQL数据库上运行一个查询。我正在搜索的表有一个file_type字段,它将是三个值之一(1,2,3)。根据这些值,我想从数据库中查找不同的信息。

例如,如果'file_type'字段是1或2,那么我想选择字段a,b,c,d 但是,如果我注意到file_type = 3,那么我想选择字段a,b,c,d,e,f

这可以在一个SELECT语句中完成吗?像这样 - 是啊

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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列,即使它们是NULL,因为table2中对于table1中的给定行没有匹配。

这会给你一个名为Class Table Inheritance的模式。

答案 2 :(得分: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