PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Raporty Rails nie mogą znaleźć kolumny, która tam jest

W nazwach kolumn SQL nie jest rozróżniana wielkość liter, chyba że są cytowane, standard mówi, że identyfikatory powinny być znormalizowane do dużych liter, ale PostgreSQL normalizuje do małych liter:

Cytowanie identyfikatora sprawia, że ​​rozróżniana jest wielkość liter, podczas gdy nazwy niecytowane są zawsze składane małymi literami. Na przykład identyfikatory FOO , foo i "foo" są uważane za takie same przez PostgreSQL, ale "Foo" i "FOO" różnią się od tych trzech i od siebie nawzajem. (Zwijanie nazw niecytowanych na małe litery w PostgreSQL jest niezgodne ze standardem SQL, który mówi, że nazwy bez cudzysłowów powinny być składane na wielkie litery. Tak więc foo powinien być odpowiednikiem "FOO" nie "foo" zgodnie z normą. Jeśli chcesz pisać aplikacje przenośne, radzimy zawsze cytować określoną nazwę lub nigdy jej nie cytować.)

Odwołujesz się do Email w twoim SQL:

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

ale PostgreSQL narzeka na email :

column "email" does not exist

Twój niecytowany Email jest traktowany jako email ponieważ PostgreSQL normalizuje identyfikatory do małych liter. Wygląda na to, że utworzyłeś kolumny z nazwami pisanymi wielkimi literami, cytując je podwójnie:

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

lub używając :Email do identyfikacji kolumny w migracji. Jeśli zacytujesz nazwę kolumny podczas jej tworzenia, nie zostanie ona znormalizowana do małych liter (lub wielkich liter w standardowym przypadku SQL) i będziesz musiał ją podwójnie cytować i zawsze dopasowywać wielkość liter:

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

Po naprawieniu Email , będziesz miał ten sam problem z IP , Username , Reason i Length :będziesz musiał dwukrotnie zacytować je wszystkie w dowolnym SQL, który się do nich odwołuje.

Najlepszą praktyką jest używanie małych liter w nazwach kolumn i tabel, aby nie martwić się ciągłym cytowaniem. Zalecam poprawienie tabeli tak, aby nazwy kolumn były pisane małymi literami.

Na marginesie, twój 'NULL' literał ciągu:

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

wygląda dziwnie, czy na pewno nie oznaczasz, że "Username" is null? ? 'NULL' literał ciągu i wartość NULL to zupełnie różne rzeczy i nie możesz użyć = lub != aby porównać rzeczy z NULL, musisz użyć is null , is not null , is distinct from lub is not distinct from (w zależności od intencji), kiedy NULL mogą być w grze.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Benchmarking Postgres-XL

  2. Wyszukiwanie pełnotekstowe w Postgresie czy CouchDB?

  3. rake db:create baza wyrzutów nie istnieje błąd z postgresql

  4. Zmień typ kolumny i ustaw wartość niepustą

  5. Jak obliczyć sumę wielu kolumn w PostgreSQL