sql >> Database teknologi >  >> RDS >> PostgreSQL

Rails-rapporter kan ikke finde en kolonne, der er der

SQL-kolonnenavne er ufølsomme mellem store og små bogstaver, medmindre de er citeret, standarden siger, at identifikatorer skal normaliseres til store bogstaver, men PostgreSQL normaliseres til små bogstaver:

Citering af en identifikator gør den også følsom over for store og små bogstaver, hvorimod navne uden anførselstegn altid foldes med små bogstaver. For eksempel identifikatorerne FOO , foo og "foo" betragtes som de samme af PostgreSQL, men "Foo" og "FOO" er forskellige fra disse tre og hinanden. (Foldningen af ​​navne uden anførselstegn til små bogstaver i PostgreSQL er inkompatibel med SQL-standarden, som siger, at navne uden anførselstegn skal foldes til store bogstaver. Således foo skal svare til "FOO" ikke "foo" i henhold til standarden. Hvis du vil skrive bærbare applikationer, rådes du til altid at citere et bestemt navn eller aldrig citere det.)

Du henviser til Email i din SQL:

SELECT "bans".* FROM "bans"  WHERE (Email='' ...

men PostgreSQL klager over email :

column "email" does not exist

Din uangivne Email behandles som email fordi PostgreSQL normaliserer identifikatorer til små bogstaver. Det lyder som om du har oprettet kolonnerne med navne med stort bogstav ved at citere dem:

create table "bans" (
    "Email" varchar(...)
    ...
)

eller ved at bruge :Email for at identificere kolonnen i en migrering. Hvis du citerer et kolonnenavn, når det oprettes, normaliseres det ikke til små bogstaver (eller store bogstaver i SQL-standard) og du bliver nødt til at citere det dobbelte og matche store og små bogstaver for altid:

SELECT "bans".* FROM "bans"  WHERE ("Email"='' ...

Når du har rettet Email , vil du have det samme problem med IP , Username , Reason og Length :du bliver nødt til at citere dem alle sammen i enhver SQL, der refererer til dem.

Den bedste praksis er at bruge små bogstaver i kolonne- og tabelnavne, så du ikke behøver at bekymre dig om at citere ting hele tiden. Jeg vil anbefale, at du retter din tabel til at have små bogstaver kolonnenavne.

Som en sidebemærkning, din 'NULL' streng bogstavelig:

SELECT "bans".* FROM "bans"  WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^

ser mærkeligt ud, er du sikker på at du ikke mener "Username" is null ? 'NULL' streng literal og NULL-værdien er helt forskellige ting, og du kan ikke bruge = eller != for at sammenligne ting med NULL, skal du bruge is null , is not null , is distinct from , eller is not distinct from (afhængigt af din hensigt), når NULLs kan være i spil.



  1. Hvordan sender jeg argumenter til et PL/SQL-script på kommandolinjen med SQLPLUS?

  2. Sådan sletter du en kolonne i SQL

  3. Sådan opdeles en kommasepareret streng i Oracle

  4. Virkningen af ​​query_post_execution_showplan Extended Event i SQL Server 2012