Os nomes de colunas do PostgreSQL diferenciam maiúsculas de minúsculas?

157

Eu tenho uma tabela db, digamos, personsno Postgres transmitida por outra equipe que tem um nome de coluna, digamos "first_Name",. Agora estou tentando usar o comandante PG para consultar esta tabela neste nome de coluna.

select * from persons where first_Name="xyz";

E isso apenas retorna

ERRO: a coluna "first_Name" não existe

Não tenho certeza se estou fazendo algo bobo ou se há uma solução alternativa para esse problema que estou perdendo?

5122014009
fonte

Respostas:

284

Todos os identificadores (incluindo nomes de colunas) que não estão entre aspas duplas são dobrados para minúsculas no PostgreSQL. Os nomes de colunas que foram criados com aspas duplas e, portanto, mantidos em maiúsculas (e / ou outras violações de sintaxe) devem ser aspas duplas pelo resto da vida: ( "first_Name")

Portanto, sim , os nomes das colunas do PostgreSQL diferenciam maiúsculas de minúsculas:

SELECT * FROM persons WHERE "first_Name" = 'xyz';

Corrija também as aspas duplas incorretas 'xyz'. Os valores (literais de string) são colocados entre aspas simples .

Leia o manual aqui.

Meu conselho permanente é usar nomes legais com letras minúsculas exclusivamente para que aspas duplas não sejam necessárias.

Erwin Brandstetter
fonte
4
@ArtB: O padrão SQL define identificadores que não diferenciam maiúsculas de minúsculas, assim como o Postgres o implementa. O único desvio: identificadores não citados são dobrados para maiúsculas no padrão, mas pg em minúsculas tudo o que não está entre aspas. (Somente relevante em casos de canto raros.) Detalhes no manual aqui.
Erwin Brandstetter
1
@adfs: Eu não acho que posso explicar melhor do que já fiz. Para mais, siga o link do manual que eu forneci repetidamente.
Erwin Brandstetter
15
@adfs: Em SQL, foobar, FOOBARe FooBarsão o mesmo identificador. No entanto "foobar", "FooBar"e "FOOBAR"são identificadores diferentes
a_horse_with_no_name
5
@a_horse_with_no_name yes, mas sob SQL foobare FOOBARsão iguais a "FOOBAR", sob potgresql FOOBARe foobaretc são iguais a "foobar".
Jasen 14/03
1
@KamelMili: Sugiro que faça sua pergunta como pergunta , fornecendo todas as informações necessárias. Comentários não são o lugar. Você sempre pode vincular esta resposta para o contexto. E você pode deixar um comentário com o link para sua pergunta relacionada aqui (para também chamar minha atenção).
Erwin Brandstetter
16

Para citar a documentação :

Palavras-chave e identificadores não citados não diferenciam maiúsculas de minúsculas. Portanto:

UPDATE MY_TABLE SET A = 5;

pode ser equivalente a ser escrito como:

uPDaTE my_TabLE SeT a = 5;

Você também pode escrevê-lo usando identificadores citados :

UPDATE "my_table" SET "a" = 5;

A citação de um identificador faz distinção entre maiúsculas e minúsculas, enquanto nomes sem aspas são sempre dobrados para minúsculas (ao contrário do padrão SQL em que nomes sem aspas são dobrados para maiúsculas). Por exemplo, os identificadores FOO, fooe "foo"são considerados o mesmo pelo PostgreSQL, mas "Foo"e "FOO"são diferentes dos três primeiros e uns aos outros.

Se você deseja escrever aplicativos portáteis, é aconselhável que cite sempre um nome específico ou nunca o cite.

Eugene Yarmash
fonte
8

Os nomes das colunas que são maiúsculas ou minúsculas precisam ser citados duas vezes no PostgresQL. Portanto, a melhor convenção será seguir todos os casos pequenos com sublinhado.

aleatoriedade
fonte
2
Isso é incorreto conforme a explicação dada por @ Erwin-Brandstetter
Michael Silver
9
Como isso está incorreto? Se você tiver nomes de colunas que estejam em maiúsculas ou minúsculas, para consultá-los, é necessário colocar o identificador entre aspas duplas.
precisa saber é o seguinte