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.