Можем ли мы использовать параметризованные представления в Snowflake? - PullRequest
1 голос
/ 25 октября 2019

Можем ли мы использовать параметризованные представления в снежинке. Например, передать имя таблицы или имя базы данных в качестве параметров вместо жесткого кодирования?

Ответы [ 3 ]

0 голосов
/ 25 октября 2019

Я думаю, что лучший способ справиться с чем-то подобным - создать UDTF, который действует как параметризованное представление. Таким образом, по сути, вы должны ссылаться на UDTF как на представление и передавать параметры в UDTF, который затем возвращает данные, которые вы хотите использовать. Обратите внимание, что у Snowflake есть 2 опции для UDTF (SQL и Javascript):

https://docs.snowflake.net/manuals/sql-reference/udf-table-functions.html https://docs.snowflake.net/manuals/sql-reference/udf-js-table-functions.html

0 голосов
/ 30 октября 2019

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

На переменную сеанса можно ссылаться в представлении DDL, и ее необходимо будет установить влюбые сеансы, запрашивающие представление.

Для этого вы можете использовать функцию IDENTIFIER в Snowflake, которая позволяет использовать текст в качестве идентификатора объекта.

create table t1 (col1 number, col2 number);
create table t2 (col1 number, col2 number);


set ti = 't1';
create view v1 as select col1, col2 from identifier($ti);

Прежде чем запрашивать представление, вам необходимо установить переменную сеанса (в данном случае ti) в качестве имени таблицы (если необходимо, полностью).

set ti = 't1';
select * from v1; -- returns data from t1

set ti = 't2';
select * from v1; -- returns data from t2
0 голосов
/ 25 октября 2019

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

Надеюсь, это поможет... Рич

--create source tables and test records
CREATE TABLE t1 (id NUMBER, str VARCHAR);
CREATE TABLE t2 (id NUMBER, str VARCHAR);
CREATE TABLE t3 (id NUMBER, str VARCHAR);
INSERT INTO t1 VALUES(1, 'record from t1');
INSERT INTO t1 VALUES(2, 'record from t1');
INSERT INTO t2 VALUES(100, 'record from t2');
INSERT INTO t2 VALUES(101, 'record from t2');
INSERT INTO t3 VALUES(998, 'record from t3');
INSERT INTO t3 VALUES(999, 'record from t3');

--create the "wrapper" view
CREATE VIEW vw_t AS (
SELECT 't1' as table_name, * FROM t1
UNION ALL
SELECT 't2' as table_name, * FROM t2
UNION ALL 
SELECT 't3' as table_name, * FROM t3);

--try it out
SELECT * 
FROM   vw_t
WHERE  table_name = 't3';

--results
TABLE_NAME  ID     STR
t3          998    record from t3
t3          999    record from t3
...