Проблемы с пониманием, как использовать ИСКЛЮЧЕНИЕ с НАЧАЛО и КОНЕЦ - PullRequest
0 голосов
/ 15 мая 2018

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

ERROR:  syntax error at or near "WITH"
LINE 20: WITH expected (tran_id, sell_chan, total) AS (VALUES (3, 'St...

при попытке запустить следующий код.Обратите внимание, что если я удаляю части BEGIN и END и EXCEPTION, все остальное работает нормально и получает ожидаемый нулевой запрос.

-- create test database
DROP TABLE IF EXISTS test_sales;
CREATE TABLE test_sales(
  tran_id INT PRIMARY KEY,
  chan_c VARCHAR(1),
  total FLOAT
);


-- populate test database
INSERT INTO test_sales VALUES (1, 'S', 99.99);
INSERT INTO test_sales VALUES (2, 'O', 99.99);
INSERT INTO test_sales VALUES (3, 'S', 100);
INSERT INTO test_sales VALUES (4, 'O', 100);
INSERT INTO test_sales VALUES (5, 'P', 99.99);
INSERT INTO test_sales VALUES (6, 'P', 100);

BEGIN
WITH expected (tran_id, sell_chan, total) AS (VALUES (3, 'Store', 100), (4, 'Online',100), (6,'Other',100))
SELECT tran_id, sell_chan, total INTO my_temp FROM (SELECT * FROM expected) AS q1 EXCEPT (SELECT tran_id,
                CASE chan_c
                WHEN 'S' THEN 'Store'
                WHEN 'O' THEN 'Online'
                ELSE 'Other'
                END sell_chan,
                total
                FROM test_sales AS q2 WHERE q2.total>=100) EXCEPTION WHEN NO_DATA_FOUND THEN NULL; 


END;

1 Ответ

0 голосов
/ 15 мая 2018
  • Анонимные блоки должны быть сделаны с DO;
  • Чтобы вставить во временную таблицу, сначала нужно ее создать.
  • Синтаксис INSERT INTO TABLE <table> SELECT ..., а не SELECT ... INTO <table>.
  • EXCEPTION нужен блок, которому он принадлежит.
  • Примечание по поводу ваших комментариев: Таблица не является базой данных!

Попробуйте:

-- create test table
DROP TABLE IF EXISTS test_sales;
CREATE TABLE test_sales(
  tran_id INT PRIMARY KEY,
  chan_c VARCHAR(1),
  total FLOAT
);


-- populate test table
INSERT INTO test_sales VALUES (1, 'S', 99.99);
INSERT INTO test_sales VALUES (2, 'O', 99.99);
INSERT INTO test_sales VALUES (3, 'S', 100);
INSERT INTO test_sales VALUES (4, 'O', 100);
INSERT INTO test_sales VALUES (5, 'P', 99.99);
INSERT INTO test_sales VALUES (6, 'P', 100);

DROP TABLE IF EXISTS my_temp;
CREATE TEMPORARY TABLE my_temp AS SELECT * FROM test_sales WHERE 1 <> 1;

DO
$$
BEGIN
  BEGIN
    WITH expected (tran_id, sell_chan, total) AS (VALUES (3, 'Store', 100), (4, 'Online',100), (6,'Other',100))
    INSERT INTO my_temp
    SELECT tran_id, sell_chan, total  FROM (SELECT * FROM expected) AS q1 EXCEPT (SELECT tran_id,
                    CASE chan_c
                    WHEN 'S' THEN 'Store'
                    WHEN 'O' THEN 'Online'
                    ELSE 'Other'
                    END sell_chan,
                    total
                    FROM test_sales AS q2 WHERE q2.total>=100);
  EXCEPTION WHEN NO_DATA_FOUND THEN
    NULL;
  END;
END;
$$
LANGUAGE plpgsql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...