sql >> Base de Datos >  >> RDS >> PostgreSQL

Los informes de Rails no pueden encontrar una columna que esté allí

Los nombres de las columnas de SQL no distinguen entre mayúsculas y minúsculas a menos que se cite, el estándar dice que los identificadores deben normalizarse a mayúsculas, pero PostgreSQL normaliza a minúsculas:

Citar un identificador también lo hace sensible a mayúsculas y minúsculas, mientras que los nombres sin comillas siempre se doblan a minúsculas. Por ejemplo, los identificadores FOO , foo y "foo" son considerados iguales por PostgreSQL, pero "Foo" y "FOO" son diferentes de estos tres y entre sí. (El doblado de nombres sin comillas a minúsculas en PostgreSQL es incompatible con el estándar SQL, que dice que los nombres sin comillas deben doblarse a mayúsculas. Por lo tanto, foo debe ser equivalente a "FOO" no "foo" según la norma. Si desea escribir aplicaciones portátiles, se recomienda citar siempre un nombre en particular o nunca citarlo).

Estás haciendo referencia a Email en tu SQL:

SELECT "bans".* FROM "bans"  WHERE (Email='' ...

pero PostgreSQL se queja de email :

column "email" does not exist

Su Email sin comillas se trata como Email porque PostgreSQL normaliza los identificadores a minúsculas. Parece que creó las columnas con nombres en mayúsculas entre comillas dobles:

create table "bans" (
    "Email" varchar(...)
    ...
)

o usando :Email para identificar la columna en una migración. Si cita el nombre de una columna cuando se crea, entonces no se normaliza a minúsculas (o a mayúsculas en el caso estándar de SQL) y tendrá que citarlo dos veces y hacer coincidir el caso para siempre:

SELECT "bans".* FROM "bans"  WHERE ("Email"='' ...

Una vez que corrijas Email , tendrás el mismo problema con IP , Username , Reason y Length :tendrás que ponerlos entre comillas dobles en cualquier SQL que haga referencia a ellos.

La mejor práctica es usar columnas en minúsculas y nombres de tablas para que no tenga que preocuparse por citar cosas todo el tiempo. Le recomiendo que arregle su tabla para tener nombres de columnas en minúsculas.

Aparte, su 'NULL' literal de cadena:

SELECT "bans".* FROM "bans"  WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^

se ve extraño, ¿estás seguro de que no quieres decir que "Username" is null ? El 'NULL' el literal de cadena y el valor NULL son cosas completamente diferentes y no puede usar = o != para comparar cosas con NULL, debe usar is null , is not null , is distinct from , o is not distinct from (dependiendo de su intención) cuando los NULL pueden estar en juego.