Использование ввода функции Snowflake в качестве предложения From - PullRequest
0 голосов
/ 02 марта 2020

У меня есть функция, которая принимает список входных данных для составления запроса, это динамический c SQL, но не сложный способ, которым входные данные напрямую передаются в предложения from и select. В Snowflake я не могу получить его, чтобы разрешить использовать имя входа в качестве имени таблицы. Я пытался использовать функцию identifier, но все равно не повезло. Вот функция, если у кого-то есть идеи.

CREATE OR REPLACE FUNCTION aggregate_string
(p_table_name VARCHAR
,p_column_name VARCHAR
,p_where_column_name VARCHAR
,p_where_value VARCHAR
,p_order_by_YN VARCHAR
,p_order_by_column VARCHAR
)

RETURNS VARCHAR

AS

$$

SELECT
    CASE 
        WHEN TRIM(upper(p_order_by_YN)) = 'Y' AND trim(p_order_by_column)> ' ' 
    THEN (SELECT as_array(p_column_name) from p_table_name where p_where_column_name = p_where_value order by p_order_by_column)
    ELSE (SELECT as_array(p_column_name) from p_table_name where p_where_column_name = p_where_value)
END AS V_CUR


$$
;

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Если я правильно понимаю, функция генерирует оператор SQL из предоставленных входных данных. Если это так, вы можете сделать это, используя JavaScript UDF:

CREATE OR REPLACE FUNCTION aggregate_string
    (p_table_name VARCHAR
    ,p_column_name VARCHAR
    ,p_where_column_name VARCHAR
    ,p_where_value VARCHAR
    ,p_order_by_YN VARCHAR
    ,p_order_by_column VARCHAR
    )
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
        var sql = "select " + P_COLUMN_NAME + " from " + P_TABLE_NAME + " where " + P_WHERE_COLUMN_NAME + " = ";

        if (isNaN(P_WHERE_VALUE)) {
            sql += "'" + P_WHERE_VALUE.replace(/'/g, "''") + "'";
        } else {
            sql += P_WHERE_VALUE;
        }

        if (P_ORDER_BY_YN.toUpperCase() == 'Y') {
            sql += " order by " + P_ORDER_BY_COLUMN;
        }

        return sql;

    $$
    ;

    -- Where is not a number, so the where condition is single quoted
    select aggregate_string('TABLE_NAME1', 'COL1, COL2, COL3', 'WHERE_COLUMN1', 'WHERE_VALUE', 'Y', 'ORDER_BY_COL1');

    -- Where is a number (whether or not passed in single quotes), so the where condition is not quoted.
    select aggregate_string('TABLE_NAME1', 'COL1, COL2, COL3', 'WHERE_COLUMN1', 5, 'Y', 'ORDER_BY_COL1');

    -- Order by is NO, so there is no order by clause
    select aggregate_string('TABLE_NAME1', 'COL1, COL2, COL3', 'WHERE_COLUMN1', 'WHERE_VALUE', 'N', '');
0 голосов
/ 04 марта 2020

Хотя в документации это явно не упоминается, я не думаю, что динамическое c имя таблицы возможно с UDF. Однако это должно быть возможно с хранимой процедурой , которая позволяет «динамически создавать оператор SQL и выполнять его».

См. https://docs.snowflake.net/manuals/sql-reference/stored-procedures-usage.html#dynamically -creating-a- sql -statement для хорошего примера этого (воспроизведено ниже):

Создание хранимой процедуры , Эта процедура позволяет вам передать имя таблицы и получить количество строк в этой таблице (эквивалентно количеству выборок (*) из table_name):

create or replace procedure get_row_count(table_name VARCHAR)
    returns float 
    not null
    language javascript
    as
    $$
    var row_count = 0;
    // Dynamically compose the SQL statement to execute.
    // Note that we uppercased the input parameter name.
    var sql_command = "select count(*) from " + TABLE_NAME;
    // Run the statement.
    var stmt = snowflake.createStatement(
           {
           sqlText: sql_command
           }
        );
    var res = stmt.execute();
    // Get back the row count. Specifically, ...
    // ... first, get the first (and in this case only) row from the
    //  result set ...
    res.next();
    // ... then extract the returned value (which in this case is the
    // number of rows in the table).
    row_count = res.getColumnValue(1);
    return row_count;
    $$
    ;

Вызов хранимой процедуры:

call get_row_count('stproc_test_table1');
+---------------+
| GET_ROW_COUNT |
|---------------|
|             3 |
+---------------+

Показать результаты выбора количества (*) для той же таблицы:

SELECT COUNT(*) FROM stproc_test_table1;
+----------+
| COUNT(*) |
|----------|
|        3 |
+----------+

Следует понимать, что использование результатов процедуры будет немного отличаться от функции, см. Значения, возвращаемые хранимыми процедурами, не могут использоваться напрямую в SQL

...