sql >> Databáze >  >> RDS >> PostgreSQL

Reporty Rails nemohou najít sloupec, který tam je

V názvech sloupců SQL se nerozlišují velká a malá písmena, pokud nejsou uvedeny v uvozovkách, standard říká, že identifikátory by měly být normalizovány na velká písmena, ale PostgreSQL normalizuje na malá písmena:

Uvozováním identifikátoru se také rozlišují velká a malá písmena, zatímco jména neuvedená v uvozovkách jsou vždy složena na malá písmena. Například identifikátory FOO , foo a "foo" jsou PostgreSQL považovány za stejné, ale "Foo" a "FOO" se liší od těchto tří a navzájem. (Skládání neuvedených jmen na malá písmena v PostgreSQL je nekompatibilní se standardem SQL, který říká, že jména v uvozovkách by se měla skládat na velká písmena. Tedy foo by měl být ekvivalentní "FOO" ne "foo" podle normy. Pokud chcete psát přenosné aplikace, doporučujeme vám vždy uvádět konkrétní jméno nebo jej nikdy neuvádět.)

Odkazujete na Email ve vašem SQL:

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

ale PostgreSQL si stěžuje na email :

column "email" does not exist

Váš Email bez uvozovek je zpracováváno jako email protože PostgreSQL normalizuje identifikátory na malá písmena. Zní to, jako byste vytvořili sloupce s názvy velkými písmeny jejich dvojitými uvozovkami:

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

nebo pomocí :Email k identifikaci sloupce při migraci. Pokud uvedete název sloupce při jeho vytváření, pak není normalizován na malá písmena (nebo velká písmena ve standardním případě SQL) a budete jej muset uvozovat dvakrát a shodovat se s malými písmeny navždy:

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

Jakmile opravíte Email , budete mít stejný problém s IP , Username , Reason a Length :budete je muset všechny uvést v uvozovkách v jakémkoli SQL, který na ně odkazuje.

Nejlepším postupem je používat názvy sloupců a tabulek malými písmeny, abyste se nemuseli starat o neustálé citace. Doporučuji vám opravit tabulku tak, aby měla názvy sloupců malými písmeny.

Kromě toho vaše 'NULL' řetězcový literál:

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

vypadá to divně, jsi si jistý, že nemyslíš, že "Username" is null ? 'NULL' řetězcový literál a hodnota NULL jsou zcela odlišné věci a nemůžete použít = nebo != pro porovnání věcí s NULL musíte použít is null , is not null , is distinct from , nebo is not distinct from (v závislosti na vašem záměru), kdy mohou být ve hře hodnoty NULL.



  1. Odstraňte duplicitní řádky v MySQL

  2. Protokol transakcí serveru SQL – část 2

  3. Jak mohu spočítat počet slov v řetězci v Oracle?

  4. Jaký je maximální počet znaků, které nvarchar(MAX) pojme?