sql >> Databasteknik >  >> RDS >> Oracle

Oracle SELECT - Dubbla citattecken eller inga dubbla citattecken?

Svaren och länkarna om casing är korrekta, men din situation går lite längre än en enkel ärendefråga, både för att ditt kolumnnamn började med ett understreck och för att din klient uppenbarligen vanligtvis döljer citatet för dig.

Om du försökte skapa en tabell med en kolumn som heter _id , utan att citera det, då skulle du få ett 'ORA-00911:invalid character'-fel, vars orsakstext säger 'identifierare får inte börja med något annat ASCII-tecken än bokstäver och siffror'; vilket faktiskt också är fel eftersom det inte heller kan börja med ett nummer (till exempel 0_id ger 'ORA-00904::ogiltig identifierare'). Detta säkerhetskopieras av databasobjektnamnsreglerna :

Så det ser ut som att Aqua Data Studio följer en konvention att omge versionen av versaler av objektnamnet du anger med dubbla citattecken, en praxis som nämns i ett av de länkade inläggen.

Från det du har visat, select _id from ... skickas till Oracle som select "_ID" from ... , vilket är bra om kolumnnamnet skapades som "_ID" . Det verkar vara fallet för table1 , men table2 skapades som "_id" - så att fallmissmatchningen genererar den legitima ORA-00904 du ser.

Din klient ändrar inte ett kolumnnamn som redan är omgivet av dubbla citattecken, så select "_id" from ... skickas vidare till Oracle som den är och fungerar OK för table2 (men omvänt skulle det misslyckas för table1 ).

Oracle kräver att namnet omges av dubbla citattecken om det inte följer reglerna för identifierare utan citattecken, och om det skapades som citattecken – såvida inte det ursprungliga citerade värdet var giltigt ändå, det vill säga följer reglerna utan citattecken och skrevs in med versaler. Eftersom ditt kolumnnamn börjar med ett understreck, så måste alla referenser till det för Oracle stå med dubbla citattecken oavsett fall. Din klient gör bara det i bakgrunden om du inte har citerat det själv.

Att följa de råd som andra har gett om att undvika citerade identifierare och att alltid använda namn som är giltiga utan citat skulle undvika problem som detta.



  1. Gör ingenting i en triggerprocedur

  2. Analysfel:syntaxfel, oväntat '' (T_ENCAPSED_AND_WHITESPACE)

  3. Gå med i flera bord och behåll NULL

  4. använder sql union på samma bord i cakephp sökfråga