Имената на SQL колони не са чувствителни към малки букви, освен ако не са цитирани, стандартът казва, че идентификаторите трябва да се нормализират до главни букви, но PostgreSQL се нормализира до малки букви:
Цитирането на идентификатор също го прави чувствителен към малки букви, докато имената без кавички винаги се сгъват до малки букви. Например идентификаторите
FOO
,foo
и"foo"
се считат за еднакви от PostgreSQL, но"Foo"
и"FOO"
са различни от тези три и един от друг. (Сгъването на имена без кавички в малки букви в PostgreSQL е несъвместимо със стандарта SQL, който казва, че имената без кавички трябва да бъдат сгънати до главни букви. Такаfoo
трябва да е еквивалентен на"FOO"
не"foo"
според стандарта. Ако искате да пишете преносими приложения, съветваме ви винаги да цитирате определено име или никога да не го цитирате.)
Позовавате се на Email
във вашия SQL:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
но PostgreSQL се оплаква от email
:
column "email" does not exist
Вашият нецитиран Email
се третира като email
защото PostgreSQL нормализира идентификаторите в малки букви. Изглежда, че сте създали колоните с главни имена, като ги цитирате:
create table "bans" (
"Email" varchar(...)
...
)
или като използвате :Email
за идентифициране на колоната при миграция. Ако цитирате име на колона, когато е създадено, то не се нормализира до малки букви (или главни букви в стандартния случай на SQL) и ще трябва да го цитирате двойно и да съответствате на главния регистър завинаги:
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
След като коригирате Email
, ще имате същия проблем с IP
, Username
, Reason
и Length
:ще трябва да ги цитирате двойно във всеки SQL, който ги препраща.
Най-добрата практика е да използвате имена на колони и таблици с малки букви, така че да не се притеснявате да цитирате неща през цялото време. Препоръчвам ви да коригирате таблицата си така, че да има имена на колони с малки букви.
Като настрана, вашият 'NULL'
низов литерал:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
изглежда странно, сигурни ли сте, че нямате предвид "Username" is null
? 'NULL'
низовият литерал и стойността NULL са напълно различни неща и не можете да използвате =
или !=
за да сравните нещата с NULL, трябва да използвате is null
, is not null
, is distinct from
, или is not distinct from
(в зависимост от вашето намерение), когато NULL може да са в игра.