I nomi delle colonne SQL non fanno distinzione tra maiuscole e minuscole a meno che non siano citate, lo standard dice che gli identificatori dovrebbero essere normalizzati in maiuscolo ma PostgreSQL normalizza in minuscolo:
Citare un identificatore rende anche la distinzione tra maiuscole e minuscole, mentre i nomi senza virgolette vengono sempre piegati in minuscolo. Ad esempio, gli identificatori FOO
, foo
e "foo"
sono considerati uguali da PostgreSQL, ma "Foo"
e "FOO"
sono diversi da questi tre e l'uno dall'altro. (La piegatura dei nomi senza virgolette in minuscolo in PostgreSQL è incompatibile con lo standard SQL, che dice che i nomi senza virgolette dovrebbero essere piegati in maiuscolo. Pertanto, foo
dovrebbe essere equivalente a "FOO"
non "foo"
secondo la norma. Se vuoi scrivere applicazioni portatili ti consigliamo di citare sempre un nome particolare o di non citarlo mai.)
Stai facendo riferimento a Email
nel tuo SQL:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
ma PostgreSQL si lamenta di email
:
column "email" does not exist
La tua Email
non quotata viene trattato come email
perché PostgreSQL normalizza gli identificatori in minuscolo. Sembra che tu abbia creato le colonne con i nomi in maiuscolo tra virgolette doppie:
create table "bans" (
"Email" varchar(...)
...
)
o utilizzando :Email
per identificare la colonna in una migrazione. Se citi il nome di una colonna quando viene creata, non viene normalizzato in minuscolo (o maiuscolo nel caso standard SQL) e dovrai virgolettarlo due volte e abbinare il maiuscolo per sempre:
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
Dopo aver corretto Email
, avrai lo stesso problema con IP
, Username
, Reason
e Length
:dovrai virgolettarli tutti in qualsiasi SQL che li faccia riferimento.
La procedura migliore consiste nell'utilizzare nomi di tabelle e colonne in minuscolo in modo da non doversi preoccupare di citare continuamente le cose. Ti consiglio di correggere la tabella in modo che i nomi delle colonne siano minuscoli.
Per inciso, il tuo 'NULL'
letterale stringa:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
sembra strano, sei sicuro di non voler dire che "Username" is null
? Il 'NULL'
string literal e il valore NULL sono cose completamente diverse e non puoi usare =
o !=
per confrontare le cose con NULL, devi usare is null
, is not null
, is distinct from
o is not distinct from
(a seconda delle tue intenzioni) quando potrebbero essere in gioco NULL.