W nazwach kolumn SQL nie jest rozróżniana wielkość liter, chyba że są cytowane, standard mówi, że identyfikatory powinny być znormalizowane do dużych liter, ale PostgreSQL normalizuje do małych liter:
Cytowanie identyfikatora sprawia, że rozróżniana jest wielkość liter, podczas gdy nazwy niecytowane są zawsze składane małymi literami. Na przykład identyfikatory FOO , foo i "foo" są uważane za takie same przez PostgreSQL, ale "Foo" i "FOO" różnią się od tych trzech i od siebie nawzajem. (Zwijanie nazw niecytowanych na małe litery w PostgreSQL jest niezgodne ze standardem SQL, który mówi, że nazwy bez cudzysłowów powinny być składane na wielkie litery. Tak więc foo powinien być odpowiednikiem "FOO" nie "foo" zgodnie z normą. Jeśli chcesz pisać aplikacje przenośne, radzimy zawsze cytować określoną nazwę lub nigdy jej nie cytować.)
Odwołujesz się do Email w twoim SQL:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
ale PostgreSQL narzeka na email :
column "email" does not exist
Twój niecytowany Email jest traktowany jako email ponieważ PostgreSQL normalizuje identyfikatory do małych liter. Wygląda na to, że utworzyłeś kolumny z nazwami pisanymi wielkimi literami, cytując je podwójnie:
create table "bans" (
"Email" varchar(...)
...
)
lub używając :Email do identyfikacji kolumny w migracji. Jeśli zacytujesz nazwę kolumny podczas jej tworzenia, nie zostanie ona znormalizowana do małych liter (lub wielkich liter w standardowym przypadku SQL) i będziesz musiał ją podwójnie cytować i zawsze dopasowywać wielkość liter:
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
Po naprawieniu Email , będziesz miał ten sam problem z IP , Username , Reason i Length :będziesz musiał dwukrotnie zacytować je wszystkie w dowolnym SQL, który się do nich odwołuje.
Najlepszą praktyką jest używanie małych liter w nazwach kolumn i tabel, aby nie martwić się ciągłym cytowaniem. Zalecam poprawienie tabeli tak, aby nazwy kolumn były pisane małymi literami.
Na marginesie, twój 'NULL' literał ciągu:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
wygląda dziwnie, czy na pewno nie oznaczasz, że "Username" is null? ? 'NULL' literał ciągu i wartość NULL to zupełnie różne rzeczy i nie możesz użyć = lub != aby porównać rzeczy z NULL, musisz użyć is null , is not null , is distinct from lub is not distinct from (w zależności od intencji), kiedy NULL mogą być w grze.