PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails-Berichte können eine vorhandene Spalte nicht finden

Bei SQL-Spaltennamen wird die Groß-/Kleinschreibung nicht beachtet, es sei denn, sie werden in Anführungszeichen gesetzt. Der Standard besagt, dass Bezeichner in Großbuchstaben normalisiert werden sollten, PostgreSQL jedoch in Kleinbuchstaben:

Wenn Sie einen Bezeichner in Anführungszeichen setzen, wird auch zwischen Groß- und Kleinschreibung unterschieden, während Namen ohne Anführungszeichen immer in Kleinbuchstaben umgewandelt werden. Beispielsweise die Kennungen FOO , foo , und "foo" werden von PostgreSQL als gleich angesehen, aber "Foo" und "FOO" unterscheiden sich von diesen drei und voneinander. (Das Falten von Namen ohne Anführungszeichen in Kleinbuchstaben in PostgreSQL ist mit dem SQL-Standard nicht kompatibel, der besagt, dass Namen ohne Anführungszeichen in Großbuchstaben umgewandelt werden sollten. Daher foo sollte "FOO" entsprechen nicht "foo" nach Norm. Wenn Sie portable Anwendungen schreiben möchten, sollten Sie einen bestimmten Namen immer oder niemals angeben.)

Sie beziehen sich auf Email in Ihrem SQL:

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

aber PostgreSQL beschwert sich über Email :

column "email" does not exist

Ihre nicht zitierte Email wird als Email behandelt da PostgreSQL Bezeichner auf Kleinbuchstaben normalisiert. Klingt so, als hätten Sie die Spalten mit großgeschriebenen Namen durch doppelte Anführungszeichen erstellt:

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

oder mit :Email um die Spalte in einer Migration zu identifizieren. Wenn Sie einen Spaltennamen bei der Erstellung in Anführungszeichen setzen, wird er nicht in Kleinbuchstaben (oder Großbuchstaben im SQL-Standardfall) normalisiert, und Sie müssen ihn in doppelte Anführungszeichen setzen und die Groß-/Kleinschreibung für immer abgleichen:

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

Sobald Sie Email repariert haben , haben Sie das gleiche Problem mit IP , Username , Reason und Length :Sie müssen sie alle in jedem SQL, das auf sie verweist, in doppelte Anführungszeichen setzen.

Am besten verwenden Sie Spalten- und Tabellennamen in Kleinbuchstaben, damit Sie sich nicht ständig Gedanken über das Zitieren machen müssen. Ich würde empfehlen, dass Sie Ihre Tabelle so reparieren, dass sie Spaltennamen in Kleinbuchstaben enthält.

Nebenbei, Ihr 'NULL' Zeichenfolgenliteral:

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

sieht seltsam aus, sind Sie sicher, dass Sie nicht "Username" is null meinen ? Der 'NULL' Zeichenfolgenliteral und der NULL-Wert sind völlig verschiedene Dinge, und Sie können = nicht verwenden oder != Um Dinge mit NULL zu vergleichen, müssen Sie is null verwenden , is not null , is distinct from , oder is not distinct from (abhängig von Ihrer Absicht), wann NULLs im Spiel sein könnten.