在PostgresQL中何时最好使用WHERE,何时最好使用CASE WHEN?

时间:2014-03-13 23:34:49

标签: sql database postgresql

我真的不明白CASE WHEN和WHERE之间的区别,它们可以用来实现同样的东西吗?请有人澄清一下吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

要理解两者之间的区别,您必须考虑SQL语句的经典结构:

SELECT ...
FROM ...
WHERE ...
ORDER BY ...;

例如,如果你想到一个名为“衬衫”的表有500行,让我们先选择所有500行:

-- first example: all rows as stored
SELECT 
  name, 
  color, 
  size, 
  maker
FROM shirts
ORDER BY name;

接下来,让我们添加一个WHERE子句。这用于将最终结果集中返回的行限制为仅匹配某些指定条件的行。例如,您可以说“WHERE color ='white'”返回一组较小的(例如)80行:

-- second example: only some rows
SELECT 
  name, 
  color, 
  size, 
  maker
FROM shirts
WHERE color = 'white'
ORDER BY name;

CASE语句提供完全不同的功能:它通常是SELECT子句的一部分 - 它本身不能是单独的子句 - 并且用于以某种方式重新格式化您收到的输出。因此,使用case语句,您仍然可以获得所有500行,但是您的结果与第一个示例中的结果不同:

-- third example: all rows, but color field is tweaked
SELECT 
  name, 
  (CASE WHEN color = 'white' THEN 'white' ELSE 'other' END) AS tweaked_color,
  size, 
  maker
FROM shirts
ORDER BY name;

在我的第一个例子中,你已经看到了“颜色”的各种值:“白色”,“黑色”,“棕色”,“黄色”,“红色”等。在第三个例子中,你将会看到80行“白色”和420行“其他”。

希望这有助于澄清差异。

P.S。请注意,为了清楚起见,我在一些不寻常的方式中安排了我的示例中的空白;你如何安排空格对语法没有任何影响。我还在CASE语句周围添加了一对不必要的括号,以帮助增加一些视觉清晰度;通常也会省略这些。