Oracle Синтаксический ли эквивалент синтаксиса 'ВСЕГДА ВСЕГДА' в Vertica? - PullRequest
0 голосов
/ 10 января 2020

Я прошу прощения за то, что у меня не было достаточного опыта в этом вопросе, но мне было поручено переключить некоторые наши Oracle запросы на синтаксис Vertica, и у меня возникают проблемы с пониманием документации по команде GENERATED ALWAYS Oracle, так как это относится к материалам дела.

Из того, что я нашел, кажется, что GENERATED ALWAYS в Oracle равно AUTO INCREMENT в Vertica.

Вот пример выражения case, которое мне нужно переписать в Vertica. На первый взгляд кажется, что он просто использует псевдоним, но я не уверен, что правильно понимаю.

FIELD_NAME varchar2(25) GENERATED ALWAYS as(
      case "FIELD_NAME"
        when 'ABC'
        then 'ABC / Category_ABC'
        when 'DEF'
        then 'DEF / Category_DEF'
        else 'Other'
      end)

Будет ли это по сути то же самое? Безопасно ли просто удалить кусок GENERATED ALWAYS? Или здесь происходит что-то большее?

FIELD_NAME varchar2(25) as(
      case "FIELD_NAME"
        when 'ABC'
        then 'ABC / Category_ABC'
        when 'DEF'
        then 'DEF / Category_DEF'
        else 'Other'
      end)

1 Ответ

1 голос
/ 14 января 2020

Это ни в коем случае не запрос, контекст, фендербендер. Это контекст определения данных. GENERATED ALWAYS или GENERATED BY DEFAULT - это атрибут столбца, который вы определяете при создании таблицы или изменении таблицы для создания или изменения столбца.

Синтаксис Vertica для этого является предложением DEFAULT определения столбца.

Если я посмотрю документ Oracle, здесь:

https://oracle-base.com/articles/11g/virtual-columns-11gr1

Я напишу их пример в Vertica так:

CREATE TABLE employees (
  id          INTEGER,
  first_name  VARCHAR(10),
  last_name   VARCHAR(10),
  salary      NUMERIC(9,2),
  comm1       NUMERIC(3),
  comm2       NUMERIC(3),
  salary1     NUMERIC(9,2) DEFAULT (ROUND(salary*(1+comm1/100),2)),
  salary2     NUMERIC(9,2) DEFAULT (ROUND(salary*(1+comm2/100),2)),
  CONSTRAINT employees_pk PRIMARY KEY (id)
);

INSERT INTO employees (id, first_name, last_name, salary, comm1, comm2)
VALUES (1, 'JOHN', 'DOE', 100, 5, 10);

INSERT INTO employees (id, first_name, last_name, salary, comm1, comm2)
VALUES (2, 'JAYNE', 'DOE', 200, 10, 20);
COMMIT;

SELECT * FROM employees;
-- out  id | first_name | last_name | salary | comm1 | comm2 | salary1 | salary2 
-- out ----+------------+-----------+--------+-------+-------+---------+---------
-- out   1 | JOHN       | DOE       | 100.00 |     5 |    10 |  105.00 |  110.00
-- out   2 | JAYNE      | DOE       | 200.00 |    10 |    20 |  220.00 |  240.00
-- out (2 rows)
-- out 
-- out Time: First fetch (2 rows): 182.567 ms. All rows formatted: 182.674 ms
...