Os nomes das colunas SQL não diferenciam maiúsculas de minúsculas, a menos que sejam citados, o padrão diz que os identificadores devem ser normalizados para maiúsculas, mas o PostgreSQL normaliza para minúsculas:
A citação de um identificador também diferencia maiúsculas de minúsculas, enquanto os nomes sem aspas são sempre dobrados para letras minúsculas. Por exemplo, os identificadoresFOO
,foo
, e"foo"
são considerados iguais pelo PostgreSQL, mas"Foo"
e"FOO"
são diferentes destes três e entre si. (A dobragem de nomes sem aspas para letras minúsculas no PostgreSQL é incompatível com o padrão SQL, que diz que nomes sem aspas devem ser dobrados para maiúsculas. Assim,foo
deve ser equivalente a"FOO"
não"foo"
de acordo com o padrão. Se você deseja escrever aplicativos portáteis, é aconselhável sempre citar um nome específico ou nunca citá-lo.)
Você está fazendo referência a
Email
em seu SQL:SELECT "bans".* FROM "bans" WHERE (Email='' ...
mas o PostgreSQL está reclamando do
email
:column "email" does not exist
Seu
Email
não citado está sendo tratado como email
porque o PostgreSQL normaliza os identificadores para letras minúsculas. Parece que você criou as colunas com nomes em maiúsculas citando-as duas vezes:create table "bans" (
"Email" varchar(...)
...
)
ou usando
:Email
para identificar a coluna em uma migração. Se você citar um nome de coluna quando ele for criado, ele não será normalizado para minúsculas (ou maiúsculas no caso padrão do SQL) e você terá que aspas duplas e corresponder às maiúsculas para sempre:SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
Depois de corrigir
Email
, você terá o mesmo problema com IP
, Username
, Reason
e Length
:você terá que colocar aspas duplas em qualquer SQL que faça referência a eles. A melhor prática é usar nomes de colunas e tabelas em letras minúsculas para que você não precise se preocupar em citar coisas o tempo todo. Eu recomendo que você corrija sua tabela para ter nomes de coluna em letras minúsculas.
Como um aparte, seu
'NULL'
literal de string:SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
parece estranho, você tem certeza que não quer dizer que
"Username" is null
? O 'NULL'
string literal e o valor NULL são coisas totalmente diferentes e você não pode usar =
ou !=
para comparar as coisas com NULL, você deve usar is null
, is not null
, is distinct from
, ou is not distinct from
(dependendo da sua intenção) quando NULLs podem estar em jogo.