Могу ли я создать другой столбец, условный к значению другого столбца в операторе SELECT представления, которое я строю? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь создать столбец со значениями, условными для предыдущего столбца в инструкции 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

Как правило, column4 будет создаваться на основе значений column3. Возможно ли это, поскольку ПРОСМОТР еще не «построен»?

Спасибо

Ответы [ 4 ]

1 голос
/ 13 мая 2019

Во-первых, в вашем примере 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;

calculated - расширение proc sql.Я не знаю ни одной другой базы данных, которая бы его поддерживала.

Альтернативой является использование подзапроса или CTE.

0 голосов
/ 13 мая 2019

Да, но вам нужно будет вложить: -

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
)
0 голосов
/ 13 мая 2019

Другой вариант: 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
0 голосов
/ 13 мая 2019

Выберите из своего дела:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...