ВЫБРАТЬ столбцы с подстановочными знаками? - PullRequest
1 голос
/ 27 марта 2019

Можно ли выбрать столбцы с подстановочными знаками в Teradata?

Как:

Select ABC_* FROM TABLE; -> Результаты во всех столбцах с именами ABC в начале.

1 Ответ

1 голос
/ 27 марта 2019

Хотя я согласен со всеми, что это странное требование, оно не ПОЛНОСТЬЮ неслыханно.К сожалению, в SQL нет встроенного способа сделать это вне некоторых сценариев.

Основной вывод здесь заключается в том, что через SQL вы не можете динамически ссылаться на объекты базы данных (таблицы, представления, процедуры, макросы, функции, базы данных, столбцы и т. Д.).Вместо этого вы должны написать скрипт, который генерирует этот SQL, а затем выполняет его, а затем возвращает вам результаты.

Мы МОЖЕМ сделать все это непосредственно в нашей базе данных, используя хранимые процедуры.

Вот краткий пример, который будет работать в Teradata (после того, как вы поменяете наши yourdatabase и yourtable для вашей фактической базы данных и таблицы):

CREATE PROCEDURE return_tablecolumns_with_ABC()

/*
 * We have to tell teradata that this will return
 * a single result set
 */
DYNAMIC RESULT SETS 1
BEGIN   

    /*
     * We need three variables here
     * 1. A varchar to hold our list of columns from dbc.columnsV
     * 2. A varchar to hold the dynamically generated SQL string
     * 3. A cursor to hold the result set of the SQL string
     */
    DECLARE column_list VARCHAR(1000);    
    DECLARE my_sql VARCHAR(500);    
    DECLARE my_cursor CURSOR WITH RETURN ONLY FOR my_statement;

    /*
     * First we query dbc.columsV for a list of columns 
     *  that match your criteria (exists in your table and
     *  and starts with ABC_)
     */
    SELECT TRIM(TRAILING ',' FROM (XMLAGG(trim(ColumnName) || ',' ORDER BY ColumnName) (VARCHAR(1000)))) INTO column_list
    FROM "DBC"."ColumnsV" 
    WHERE DatabaseName = 'yourdatabase' 
        AND TableName = 'yourtable'
        AND columnName LIKE 'ABC_%';

    /* 
     * Now we build our dynamically generated SQL string
     * This could use some polish as it will fail if your
     * columns contain spaces or anything that requires 
     * their names be encapsulated with double quotes...
     */
    SET my_sql = 'Select ' || column_list || ' FROM yourdatabase.yourtable;';

    /*
     * Now we prepare our statement from the dynamically
     * generated SQL string
     */
    PREPARE my_statement FROM my_sql;

    /*
     * And finally we open the Cursor we declared for
     * the statement we just prepared. 
     * We leave the cursor open so it will be returned
     * as a result set when this procedure is called.
     */
    OPEN my_cursor;

END;

Теперь вы можете вызвать эточтобы получить результаты:

CALL return_tablecolumns_with_ABC();
...