V názvech sloupců SQL se nerozlišují velká a malá písmena, pokud nejsou uvedeny v uvozovkách, standard říká, že identifikátory by měly být normalizovány na velká písmena, ale PostgreSQL normalizuje na malá písmena:
Uvozováním identifikátoru se také rozlišují velká a malá písmena, zatímco jména neuvedená v uvozovkách jsou vždy složena na malá písmena. Například identifikátory
FOO
,foo
a"foo"
jsou PostgreSQL považovány za stejné, ale"Foo"
a"FOO"
se liší od těchto tří a navzájem. (Skládání neuvedených jmen na malá písmena v PostgreSQL je nekompatibilní se standardem SQL, který říká, že jména v uvozovkách by se měla skládat na velká písmena. Tedyfoo
by měl být ekvivalentní"FOO"
ne"foo"
podle normy. Pokud chcete psát přenosné aplikace, doporučujeme vám vždy uvádět konkrétní jméno nebo jej nikdy neuvádět.)
Odkazujete na Email
ve vašem SQL:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
ale PostgreSQL si stěžuje na email
:
column "email" does not exist
Váš Email
bez uvozovek je zpracováváno jako email
protože PostgreSQL normalizuje identifikátory na malá písmena. Zní to, jako byste vytvořili sloupce s názvy velkými písmeny jejich dvojitými uvozovkami:
create table "bans" (
"Email" varchar(...)
...
)
nebo pomocí :Email
k identifikaci sloupce při migraci. Pokud uvedete název sloupce při jeho vytváření, pak není normalizován na malá písmena (nebo velká písmena ve standardním případě SQL) a budete jej muset uvozovat dvakrát a shodovat se s malými písmeny navždy:
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
Jakmile opravíte Email
, budete mít stejný problém s IP
, Username
, Reason
a Length
:budete je muset všechny uvést v uvozovkách v jakémkoli SQL, který na ně odkazuje.
Nejlepším postupem je používat názvy sloupců a tabulek malými písmeny, abyste se nemuseli starat o neustálé citace. Doporučuji vám opravit tabulku tak, aby měla názvy sloupců malými písmeny.
Kromě toho vaše 'NULL'
řetězcový literál:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
vypadá to divně, jsi si jistý, že nemyslíš, že "Username" is null
? 'NULL'
řetězcový literál a hodnota NULL jsou zcela odlišné věci a nemůžete použít =
nebo !=
pro porovnání věcí s NULL musíte použít is null
, is not null
, is distinct from
, nebo is not distinct from
(v závislosti na vašem záměru), kdy mohou být ve hře hodnoty NULL.