nombres de columna de SQL son sensibles a mayúsculas a menos citado, la norma dice que los identificadores deben ser normalizados a mayúsculas, pero PostgreSQL normalizes to lower case:
Quoting an identifier also makes it case-sensitive, whereas unquoted names are always folded to lower case. For example, the identifiers FOO
, foo
, and "foo"
are considered the same by PostgreSQL, but "Foo"
and "FOO"
are different from these three and each other. (The folding of unquoted names to lower case in PostgreSQL is incompatible with the SQL standard, which says that unquoted names should be folded to upper case. Thus, foo
should be equivalent to "FOO"
not "foo"
according to the standard. If you want to write portable applications you are advised to always quote a particular name or never quote it.)
que está haciendo referencia Email
en su SQL:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
pero PostgreSQL se queja de email
:
column "email" does not exist
Su Email
sin comillas se está tratando como email
porque PostgreSQL normaliza los identificadores en minúsculas. Suena como que ha creado las columnas con nombres en mayúsculas con una cita doble ellas:
create table "bans" (
"Email" varchar(...)
...
)
o utilizando :Email
para identificar la columna en una migración. Si cita un nombre de columna cuando se crea, entonces no se normaliza a minúsculas (o mayúsculas en el caso estándar SQL) y que tendrá que duplicar la cita y juego con la caja siempre:
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
Una vez que arregle Email
, tendrá el mismo problema con IP
, Username
, Reason
y Length
: tendrá que doblar todas las citas en cualquier SQL que haga referencia a ellas.
La mejor práctica es utilizar nombres de columnas y tablas de minúsculas para que no tenga que preocuparse por las citas todo el tiempo. Te recomiendo que arregles tu tabla para tener nombres de columna en minúsculas.
Como acotación al margen, su 'NULL'
cadena literal:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL'))
-- -------------------->------------------>---------->---------------^^^^^^
parece extraño, ¿está seguro de que no quiere decir "Username" is null
? El literal de cadena 'NULL'
y el valor NULL son cosas completamente diferentes y no puede usar =
o !=
para comparar cosas con NULL, tiene que usar is null
, is not null
, is distinct from
, or is not distinct from
(dependiendo de su intención) cuando NULLs podrían estar en juego.
¿está utilizando postgres con nombres de columna entre mayúsculas y minúsculas? –
la caja es exactamente lo mismo, aunque en el SQL y la tabla – nekosune
Hmm, sí, supongo que es en un solo lugar, a pesar de la columna dice que falta, en todos los niveles inferiores. –