Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle SELECT - Virgolette doppie o niente virgolette?

Le risposte e i link sul maiuscolo sono corretti, ma la tua situazione va un po' oltre un semplice problema relativo a un caso, sia perché il nome della tua colonna inizia con un trattino basso sia perché il tuo cliente di solito ti nasconde le virgolette.

Se hai provato a creare una tabella con una colonna chiamata _id , senza virgolette, otterresti un errore "ORA-00911:carattere non valido", il cui testo della causa dice "gli identificatori non possono iniziare con alcun carattere ASCII diverso da lettere e numeri"; che in realtà è anche sbagliato poiché non può nemmeno iniziare con un numero (ad esempio, 0_id restituisce 'ORA-00904::identificatore non valido'). Ciò è supportato dalle regole di denominazione degli oggetti del database :

Quindi sembra che Aqua Data Studio stia seguendo una convenzione di racchiudere la versione maiuscola del nome dell'oggetto che fornisci tra virgolette, una pratica menzionata in uno dei post collegati.

Da ciò che hai mostrato, select _id from ... viene passato a Oracle come select "_ID" from ... , che va bene se il nome della colonna è stato creato come "_ID" . Sembra che sia il caso di table1 , ma table2 è stato creato come "_id" - in modo che la mancata corrispondenza del caso generi il legittimo ORA-00904 che stai vedendo.

Il tuo client non sta modificando il nome di una colonna che è già racchiuso tra virgolette, quindi select "_id" from ... viene passato a Oracle così com'è e funziona correttamente per table2 (ma, al contrario, fallirebbe per table1 ).

Oracle richiede che il nome sia racchiuso tra virgolette se non segue le regole per gli identificatori senza virgolette e se è stato creato come citato, a meno che il valore originale citato non fosse comunque valido, ovvero segua le regole non virgolette ed è stato inserito in maiuscolo. Poiché il nome della tua colonna inizia con un trattino basso, per quanto riguarda Oracle tutti i riferimenti ad essa devono essere racchiusi tra virgolette indipendentemente dal caso. Il tuo cliente lo sta facendo in background se non l'hai citato tu stesso.

Seguendo i consigli che altri hanno dato di evitare gli identificatori tra virgolette e di utilizzare sempre nomi validi senza virgolette eviterebbe problemi come questo.