SQL-kolumnnamn är skiftlägesokänsliga om de inte citeras, standarden säger att identifierare ska normaliseras till versaler men PostgreSQL normaliseras till gemener:
Att citera en identifierare gör den också skiftlägeskänslig, medan namn utan citattecken alltid viks till gemener. Till exempel identifierarna
FOO
,foo
och"foo"
anses vara samma av PostgreSQL, men"Foo"
och"FOO"
skiljer sig från dessa tre och varandra. (Vikningen av namn utan citattecken till gemener i PostgreSQL är inkompatibel med SQL-standarden, som säger att namn utan citattecken ska vikas till versaler. Alltsåfoo
ska motsvara"FOO"
inte"foo"
enligt standarden. Om du vill skriva bärbara applikationer rekommenderas du att alltid citera ett visst namn eller aldrig citera det.)
Du hänvisar till Email
i din SQL:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
men PostgreSQL klagar på email
:
column "email" does not exist
Din email
utan citat behandlas som email
eftersom PostgreSQL normaliserar identifierare till gemener. Det låter som att du skapade kolumnerna med versaler genom att dubbelcitera dem:
create table "bans" (
"Email" varchar(...)
...
)
eller genom att använda :Email
för att identifiera kolumnen i en migrering. Om du citerar ett kolumnnamn när det skapas, normaliseras det inte till gemener (eller versaler i SQL-standard) och du måste dubbelcitera det och matcha skiftläge för alltid:
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
När du har fixat Email
, kommer du att ha samma problem med IP
, Username
, Reason
och Length
:du måste dubbelcitera dem alla i vilken SQL som helst som refererar till dem.
Det bästa är att använda små bokstäver kolumn- och tabellnamn så att du inte behöver oroa dig för att citera saker hela tiden. Jag skulle rekommendera att du fixar din tabell så att den har små bokstäver kolumnnamn.
Till skillnad från din 'NULL'
sträng bokstavlig:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
ser konstigt ut, är du säker på att du inte menar att "Username" is null
? 'NULL'
string literal och NULL-värdet är helt olika saker och du kan inte använda =
eller !=
för att jämföra saker mot NULL måste du använda is null
, is not null
, is distinct from
, eller is not distinct from
(beroende på din avsikt) när NULLs kan vara i spel.