【问题标题】:SELECT Columns with wildcards?选择带有通配符的列?
【发布时间】:2019-08-18 07:45:32
【问题描述】:

是否可以在 Teradata 中选择带有通配符的列?

喜欢:

Select ABC_* FROM TABLE; -> 结果所有列都以 ABC 名称开头。

【问题讨论】:

  • 简单的答案是否定的——SQL 不能那样工作。最接近的方法是编写一个程序来读取数据库,找到匹配的列名,然后为您编写 SQL。但是您需要自己编写该程序。
  • 您可以为此使用动态 SQL,但我很难想象何时需要这样做。为什么需要它?
  • 让我们想象一些表,比如说一个用户表。列可能是:first_name、last_name、address、phone、birthdate、login_name。并且您想要select l* from users 之类的东西,以便获得last_name 和login_name 而不必在查询中拼出它们?一个奇怪的要求,对吧?所以,我想知道你在处理一个多么奇怪的数据库。也许它的设计有问题?如果您需要这方面的帮助,您可以在此处提出带有数据库设计标签的问题。

标签: sql select teradata


【解决方案1】:

虽然我同意每个人的看法,这是一个奇怪的要求,但并非完全没有听说过。不幸的是,除了一些脚本之外,没有内置的 SQL 方法可以做到这一点。

这里的基本要点是,您不能通过 SQL 动态引用数据库对象(表、视图、过程、宏、函数、数据库、列等)。相反,您必须编写生成该 SQL 的脚本,然后执行它,然后将结果返回给您。

我们可以通过使用存储过程直接在我们的数据库中完成所有这些操作。

这是一个适用于 Teradata 的快速示例(在您将我们的 yourdatabaseyourtable 替换为您的实际数据库和表之后):

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();

【讨论】:

  • 你知道我希望有一个 SQL 扩展来做到这一点。一些“包含”或“排除”子句按名称、一般类型、LOB、大小、前缀、后缀、序数(例如“仅前 5 个”)等过滤列。这将使我的生活变得更轻松当我遇到需要加入的包含 60 列的表时。
猜你喜欢
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多