Хотя я согласен со всеми, что это странное требование, оно не ПОЛНОСТЬЮ неслыханно.К сожалению, в 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();