SQL select join: is it possible to prefix all columns as 'prefix.*'?

后端 未结 22 1751
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-02 06:20

I\'m wondering if this is possible in SQL. Say you have two tables A and B, and you do a select on table A and join on table B:

SELECT a.*, b.* FROM TABLE_A a         


        
22条回答
  •  渐次进展
    2020-12-02 06:42

    This question is very useful in practice. It's only necessary to list every explicit columns in software programming, where you pay particular careful to deal with all conditions.

    Imagine when debugging, or, try to use DBMS as daily office tool, instead of something alterable implementation of specific programmer's abstract underlying infrastructure, we need to code a lot of SQLs. The scenario can be found everywhere, like database conversion, migration, administration, etc. Most of these SQLs will be executed only once and never be used again, give the every column names is just waste of time. And don't forget the invention of SQL isn't only for the programmers use.

    Usually I will create a utility view with column names prefixed, here is the function in pl/pgsql, it's not easy but you can convert it to other procedure languages.

    -- Create alias-view for specific table.
    
    create or replace function mkaview(schema varchar, tab varchar, prefix varchar)
        returns table(orig varchar, alias varchar) as $$
    declare
        qtab varchar;
        qview varchar;
        qcol varchar;
        qacol varchar;
        v record;
        sql varchar;
        len int;
    begin
        qtab := '"' || schema || '"."' || tab || '"';
        qview := '"' || schema || '"."av' || prefix || tab || '"';
        sql := 'create view ' || qview || ' as select';
    
        for v in select * from information_schema.columns
                where table_schema = schema and table_name = tab
        loop
            qcol := '"' || v.column_name || '"';
            qacol := '"' || prefix || v.column_name || '"';
    
            sql := sql || ' ' || qcol || ' as ' || qacol;
            sql := sql || ', ';
    
            return query select qcol::varchar, qacol::varchar;
        end loop;
    
        len := length(sql);
        sql := left(sql, len - 2); -- trim the trailing ', '.
        sql := sql || ' from ' || qtab;
    
        raise info 'Execute SQL: %', sql;
        execute sql;
    end
    $$ language plpgsql;
    

    Examples:

    -- This will create a view "avp_person" with "p_" prefix to all column names.
    select * from mkaview('public', 'person', 'p_');
    
    select * from avp_person;
    

提交回复
热议问题