PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Rails отчетите не могат да намерят колона, която е там

Имената на SQL колони не са чувствителни към малки букви, освен ако не са цитирани, стандартът казва, че идентификаторите трябва да се нормализират до главни букви, но PostgreSQL се нормализира до малки букви:

Цитирането на идентификатор също го прави чувствителен към малки букви, докато имената без кавички винаги се сгъват до малки букви. Например идентификаторите FOO , foo и "foo" се считат за еднакви от PostgreSQL, но "Foo" и "FOO" са различни от тези три и един от друг. (Сгъването на имена без кавички в малки букви в PostgreSQL е несъвместимо със стандарта SQL, който казва, че имената без кавички трябва да бъдат сгънати до главни букви. Така foo трябва да е еквивалентен на "FOO" не "foo" според стандарта. Ако искате да пишете преносими приложения, съветваме ви винаги да цитирате определено име или никога да не го цитирате.)

Позовавате се на Email във вашия SQL:

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

но PostgreSQL се оплаква от email :

column "email" does not exist

Вашият нецитиран Email се третира като email защото PostgreSQL нормализира идентификаторите в малки букви. Изглежда, че сте създали колоните с главни имена, като ги цитирате:

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

или като използвате :Email за идентифициране на колоната при миграция. Ако цитирате име на колона, когато е създадено, то не се нормализира до малки букви (или главни букви в стандартния случай на SQL) и ще трябва да го цитирате двойно и да съответствате на главния регистър завинаги:

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

След като коригирате Email , ще имате същия проблем с IP , Username , Reason и Length :ще трябва да ги цитирате двойно във всеки SQL, който ги препраща.

Най-добрата практика е да използвате имена на колони и таблици с малки букви, така че да не се притеснявате да цитирате неща през цялото време. Препоръчвам ви да коригирате таблицата си така, че да има имена на колони с малки букви.

Като настрана, вашият 'NULL' низов литерал:

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

изглежда странно, сигурни ли сте, че нямате предвид "Username" is null ? 'NULL' низовият литерал и стойността NULL са напълно различни неща и не можете да използвате = или != за да сравните нещата с NULL, трябва да използвате is null , is not null , is distinct from , или is not distinct from (в зависимост от вашето намерение), когато NULL може да са в игра.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_restore Алтернативи - PostgreSQL архивиране и автоматично възстановяване с ClusterControl

  2. Как да приложим връзка много към много в PostgreSQL?

  3. Показване на изображение в Ireports с помощта на PostgreSql

  4. Как да възстановите непоследователен PostgreSQL Slave

  5. PostgreSQL EXPLAIN – Какви са разходите за заявка?