2014-10-29 20 views
6

Sto avendo questo strano problema usando PostgreSQL 9.3 con tabelle create usando qoutes. Per esempio, se creo una tabella utilizzando qoutes:ERRORE PostgreSQL: 42P01: relazione "[Tabella]" non esiste

create table "TEST" ("Col1" bigint); 

la tabella viene correttamente creato e posso vedere che le quotazioni si mantengono quando vista nel riquadro SQL di pgAdminIII. Ma quando chiedo al DB di trovare l'elenco di tutte le tabelle disponibili (usando la query sottostante), vedo che il risultato non contiene virgolette attorno al nome della tabella.

select table_schema, table_name from information_schema.tables where not table_schema='pg_catalog' and not table_schema='information_schema'; 

Dal momento che il tavolo è stato creato con le citazioni, non posso utilizzare il nome della tabella restituita dalla query sopra direttamente dal momento che è non quotate e genera l'errore nel postato nel titolo.

Potrei provare a circondare i nomi delle tabelle con le virgolette in tutte le query, ma non sono sicuro che funzionerà sempre. Sto cercando un modo per ottenere l'elenco dei nomi delle tabelle citati tra virgolette nel risultato.

Sto riscontrando lo stesso problema con i nomi delle colonne, ma spero che se riesco a trovare una soluzione al problema dei nomi delle tabelle, una soluzione simile funzionerà anche per i nomi delle colonne.

risposta

15

si hanno due scelte: - senza virgolette: quindi tutto sarà automaticamente minuscolo e maiuscolo-minuscolo - con virgolette: d'ora in poi tutto è case sensitive.

consiglio vivamente di NON usare virgolette e rendere PostgreSQL non sensibile al maiuscolo/minuscolo. Rende la vita molto più semplice. una volta preso il preventivo, devi usarlo OVUNQUE in quanto PostgreSQL inizierà a essere molto preciso.

alcuni esempi:

TEST = test  <-- non case sensitive 
    "Test" <> Test <-- first is precise, second one is turned to lower case 
    "Test" = "Test" <-- will work 
    "test" = TEST  <-- should work; but you are just lucky. 

davvero cercare di evitare questo tipo di inganno ad ogni costo. resta con 7 bit ASCII per i nomi degli oggetti.

+0

+1 ad usare senza virgolette. – Othya

+0

D'accordo sul fatto che non usare le virgolette in PostgreSQL rende la vita più semplice ma non sempre possibile nel mio caso poiché la mia applicazione non crea i database. Dovrebbe essere in grado di leggere i dati da database PostgreSQL di terze parti e non posso controllare come le tabelle vengono create da altri. In ogni caso, ciò che sorprende è che PostgreSQL non mi dice che una certa tabella è stata creata con le virgolette, ma quando uso un nome di tabella non quotato in una query, non lo consente. –

+1

sa automaticamente che le citazioni sono state utilizzate non appena c'è una lettera non minuscola lì. quindi se una tabella è elencata come Test o così significa già che devi essere case sensitive. –

0

Una funzione di stringa utilizzata per virgolette opportune identificatori in una stringa di istruzioni SQL è quote_ident(), che fa riferimento a good example (utilizzato in combinazione con quote_literal() correlato).

Per usare il tuo esempio, e mescolare in altri risultati:

select 
    quote_ident(table_schema) as table_schema, 
    quote_ident(table_name) as table_name 
... 

table_schema | table_name 
--------------+------------------ 
... 
public  | good_name 
public  | "table" 
public  | some_table 
public  | "something else" 
public  | "Tom's work" 
public  | "TEST" 
... 
Problemi correlati