sql >> Databasteknik >  >> RDS >> PostgreSQL

Rails rapporter kan inte hitta en kolumn som finns där

SQL-kolumnnamn är skiftlägesokänsliga om de inte citeras, standarden säger att identifierare ska normaliseras till versaler men PostgreSQL normaliseras till gemener:

Att citera en identifierare gör den också skiftlägeskänslig, medan namn utan citattecken alltid viks till gemener. Till exempel identifierarna FOO , foo och "foo" anses vara samma av PostgreSQL, men "Foo" och "FOO" skiljer sig från dessa tre och varandra. (Vikningen av namn utan citattecken till gemener i PostgreSQL är inkompatibel med SQL-standarden, som säger att namn utan citattecken ska vikas till versaler. Alltså foo ska motsvara "FOO" inte "foo" enligt standarden. Om du vill skriva bärbara applikationer rekommenderas du att alltid citera ett visst namn eller aldrig citera det.)

Du hänvisar till Email i din SQL:

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

men PostgreSQL klagar på email :

column "email" does not exist

Din email utan citat behandlas som email eftersom PostgreSQL normaliserar identifierare till gemener. Det låter som att du skapade kolumnerna med versaler genom att dubbelcitera dem:

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

eller genom att använda :Email för att identifiera kolumnen i en migrering. Om du citerar ett kolumnnamn när det skapas, normaliseras det inte till gemener (eller versaler i SQL-standard) och du måste dubbelcitera det och matcha skiftläge för alltid:

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

När du har fixat Email , kommer du att ha samma problem med IP , Username , Reason och Length :du måste dubbelcitera dem alla i vilken SQL som helst som refererar till dem.

Det bästa är att använda små bokstäver kolumn- och tabellnamn så att du inte behöver oroa dig för att citera saker hela tiden. Jag skulle rekommendera att du fixar din tabell så att den har små bokstäver kolumnnamn.

Till skillnad från din 'NULL' sträng bokstavlig:

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

ser konstigt ut, är du säker på att du inte menar att "Username" is null ? 'NULL' string literal och NULL-värdet är helt olika saker och du kan inte använda = eller != för att jämföra saker mot NULL måste du använda is null , is not null , is distinct from , eller is not distinct from (beroende på din avsikt) när NULLs kan vara i spel.



  1. Hur utför man IF-satsen i SQL?

  2. Proaktiva SQL Server Health Checks, Del 2:Underhåll

  3. Konvertera 'tid' till 'datetime2' i SQL Server (T-SQL-exempel)

  4. MariaDB JSON_QUERY() Förklarad