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.