sql >> Databasteknik >  >> RDS >> Oracle

Returnera Oracle-kolumnnamn i formatet table.column?

Det finns inget "alternativ" i Oracle för att göra detta; du får kunna hitta en klient som tillåter dig att göra det eftersom detta är ett jobb som normalt skulle utföras i klienten; Jag känner inte till någon.

För att utöka tbones svar du kommer att behöva göra detta dynamiskt. Detta gör inte innebär att du måste lista varje kolumn. Du skulle använda dataordboken , närmare bestämt all_tab_columns eller user_tab_columns för att skapa din fråga. Det skulle vara lättare att skapa en vy med exakt den definition du vill ha så att du kan återanvända den om du vill.

Syftet är att använda det faktum att kolumnernas existens lagras i en tabell som en sträng för att skapa en fråga för att använda den kolumnen. Eftersom kolumnnamnen och tabellnamnen lagras som strängar kan du använda strängaggregationstekniker för att enkelt skapa en fråga eller DDL-sats som du sedan kan köra manuellt eller dynamiskt.

Om du använder Oracle 11g Release 2 är >listagg funktionen är tillgänglig för att hjälpa dig:

select 'create or replace view my_view as 
        select '
      || listagg( table_name || '.' || column_name 
               || ' as ' 
               || substr(table_name,1,1) || '_' 
               || column_name, ', ')
        within group 
         ( order by case when table_name = 'FOO' then 0 else 1 end
                  , column_id
          )
       || ' from foo f
            join bar b
              on f.id = b.foo_id'
  from user_tab_columns
 where table_name in ('FOO','BAR')
        ;

Antag denna tabellstruktur:

create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);

Denna enda fråga producerar följande:

create or replace view my_view as 
 select FOO.ID as F_ID, FOO.A as F_A, FOO.B as F_B, FOO.C as F_C
      , BAR.FOO_ID as B_FOO_ID, BAR.A as B_A, BAR.B as B_B, BAR.C as B_C 
   from foo f 
   join bar b on f.id = b.foo_id

och här är en SQL-fiol för att bevisa det.

Om du inte använder 11.2 kan du uppnå exakt samma resultat med den odokumenterade funktionen wm_concat eller den användardefinierade funktionen stragg , som skapades av Tom Kyte. Oracle Base har en artikel om tekniker för strängaggregation och det finns många inlägg på Stack Overflow.

Som ett litet tillägg kan du faktiskt skapa precis det du letar efter med en liten ändring av ovanstående fråga. Du kan använda en citerad identifierare för att skapa en kolumn i TABLE_NAME.COLUMN_NAME formatera. Du har för att citera det som . är inte ett giltigt tecken för ett objektnamn i Oracle. Fördelen med detta är att du får precis det du vill ha. Nackdelen är att det är svårt att fråga efter den skapade vyn om du inte använder välj * från ...; att välja namngivna kolumner kräver dem ska citeras.

select 'create or replace view my_view as
        select '
      || listagg( table_name || '.' || column_name 
               || ' as ' 
               || '"' || table_name || '.'
               || column_name || '"', ', ')
        within group 
         ( order by case when table_name = 'FOO' then 0 else 1 end
                  , column_id
          )
       || ' from foo f
            join bar b
              on f.id = b.foo_id'
  from user_tab_columns
 where table_name in ('FOO','BAR')
        ;

Denna fråga returnerar :

create or replace view my_view as 
 select FOO.ID as "FOO.ID", FOO.A as "FOO.A", FOO.B as "FOO.B", FOO.C as "FOO.C"
      , BAR.FOO_ID as "BAR.FOO_ID", BAR.A as "BAR.A"
      , BAR.B as "BAR.B", BAR.C as "BAR.C"
   from foo f 
   join bar b on f.id = b.foo_id


  1. Mysql Real Escape String PHP-funktion Lägger till \ till My Field Entry

  2. MYSQL-tabell med statiska värden och dynamiska värden

  3. Postgresql - returnera hela raden som array

  4. Hur delar man upp en varchar-kolumn som flera värden i SQL?