我可以在要建立的视图的SELECT语句中创建以另一列为条件的另一列吗?

时间:2019-05-13 13:25:37

标签: sql sas

我正在尝试创建一个列,其值以SELECT语句中的上一列为条件。首先,第3列将导致字符串从“ Case 01”到“ Case 02”,并且也是CASE语句。

CREATE VIEW name AS(
  SELECT column1, column2, colum 3,

    CASE
      WHEN SUBSTRING(column3,1,6) = 'Case 01'   THEN ...
      WHEN SUBSTRING(column3,1,6) = 'Case 02'   THEN ...
      WHEN SUBSTRING(column3,1,6) = 'Case 03'   THEN ...

    END AS column4

  FROM random_table

基本上,将基于column3的值创建column4。这是可能的,因为还没有“构建” VIEW?

谢谢

4 个答案:

答案 0 :(得分:1)

首先,在您的示例中,column3是表中的一列,因此可以在后续表达式中使用它:

CREATE VIEW name AS
  SELECT column1, column2, column3,
         (CASE WHEN SUBSTRING(column3, 1, 6) = 'Case 01' THEN ...
               WHEN SUBSTRING(column3, 1, 6) = 'Case 02' THEN ...
               WHEN SUBSTRING(column3, 1, 6) = 'Case 03' THEN ...
               . . .
          END) AS column4
  FROM random_table;

请注意,子查询周围的括号不是必需的。

如果您要为该列分配别名,则可以使用calculated关键字:

CREATE VIEW name AS
  SELECT column1, column2, column3 as col3,
         (CASE WHEN SUBSTRING(calculated col3, 1, 6) = 'Case 01' THEN ...
               WHEN SUBSTRING(calculated col3, 1, 6) = 'Case 02' THEN ...
               WHEN SUBSTRING(calculated col3, 1, 6) = 'Case 03' THEN ...
               . . .
          END) AS column4
  FROM random_table;

calculatedproc sql的扩展名。我不知道任何其他支持它的数据库。

替代方法是使用子查询或CTE。

答案 1 :(得分:0)

从您的案例陈述中选择:

CREATE VIEW name AS(
  select column1, column2, column3, column4, 
    case column4
      when ... then ...
    end as column5
  from
  (
  SELECT column1, column2, colum 3,

    CASE
      WHEN SUBSTRING(column3,1,6) = 'Case 01'   THEN ...
      WHEN SUBSTRING(column3,1,6) = 'Case 02'   THEN ...
      WHEN SUBSTRING(column3,1,6) = 'Case 03'   THEN ...

    END AS column4

  FROM random_table ) t1

答案 2 :(得分:0)

是的,但是您需要嵌套:-

CREATE VIEW name AS(
Select column1, colum2, column 3, Case WHEN column3="Case 1" then... END as column 4  
from (
      SELECT column1, column2, CASE
      WHEN columnn2 = 'x' then 'Case 1 End as column2
      FROM random_table) aa
)

答案 3 :(得分:0)

另一个选项是CROSS APPLY

CREATE VIEW name AS
  SELECT column1, column2, column3, column4, column5
  FROM random_table t1
  CROSS APPLY (
    SELECT CASE ... <expression depdending on column1, column2, column3> .. END column4 ) t2
  CROSS APPLY (
    SELECT  CASE ... <expression depdending on column1,..column4> .. END column5) t3

快速演示

WITH tbl1 AS 
(
    SELECT * FROM (VALUES (1),(3))tt(col1)
)
, tbl2 AS 
(
    SELECT * FROM (VALUES (1),(2))tt(col1)
)
SELECT t1.col1, t2.col1, col2, col3
FROM tbl1 t1
FULL JOIN tbl2 t2 ON t1.col1=t2.col1
CROSS APPLY (
  SELECT isnull(t1.col1,100) + isnull(t2.col1,100) col2
  ) tt
CROSS APPLY (
  SELECT  col2*col2  col3
  ) ttt

结果

col1    col1    col2    col3
1   1   2   4
NULL    2   102 10404
3   NULL    103 10609