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.