SQL返回基于其他列的列

时间:2019-05-15 16:59:13

标签: sql postgresql

我有

ABC ABD ABE ect

它工作正常,但我想计算

var text = ""; var x = 123; while (x > 0) { text += "<br>The number is " + x; x=x/10; } document.getElementById("demo").innerHTML = text;基于<p id="demo"></p>的值

它应该很简单SELECT col, col1 from table CASE WHEN other_col = 'Canada' THEN 1 ELSE 2 END AS col2 = col3中的值 并以相同的col2

返回

如何实现?

3 个答案:

答案 0 :(得分:1)

您不能在同一select语句内的col2之类的表达式中使用col2 / 2列。
您可以像这样重复相同的CASE语句:

SELECT 
  col, 
  col1, 
  CASE WHEN other_col = 'Canada' THEN 1 ELSE 2 END AS col2
  CASE WHEN other_col  = 'Canada' THEN 0.5 ELSE 1 END AS col3
FROM table

或通过将SELECT语句嵌套在另一个内部:

SELECT
  t.*,
  t.col2 / 2 AS col3
FROM (
  SELECT 
    col, 
    col1, 
    CASE WHEN other_col = 'Canada' THEN 1 ELSE 2 END AS col2
  FROM table 
) AS t

答案 1 :(得分:0)

不能使用别名的原因是因为“一次全部”表达式求值。 表达式不是按顺序求值,而是“一次全部”求值,这也使您可以执行

UPDATE Table SET Col1 = Col2, Col2 = Col1...

如果按顺序处理表达式,则不可能。

恕我直言,使用CTE而不是重复CASE更加容易和清楚。

;WITH CTE AS
(
SELECT col, col1, CASE
                  WHEN other_col = 'Canada' 
                    THEN  1
                  ELSE 2
                  END AS col2
FROM table
)
SELECT *, <Whatever Function On (Col2).
FROM CTE;

答案 2 :(得分:0)

您可以在Postgres中使用横向连接:

SELECT t.col, t.col1, v.col2
FROM table t CROSS JOIN LATERAL
     (VALUES (CASE WHEN other_col = 'Canada' THEN  1 ELSE 2 END)
     ) v(col2);

然后,您可以使用v.col2使自己想要的任何其他表情都感到高兴。