Como lidar com nomes de colunas SQL que se parecem com palavras-chave SQL?

226

Uma das minhas colunas é chamada from. Não posso mudar o nome porque não o fiz. Posso fazer algo parecido SELECT from FROM TableNameou existe uma sintaxe especial para evitar que o SQL Server seja confundido?

Nathan H
fonte
3
Eu diria que use aspas duplas do ANSI SQL para identificadores delimitados. Ele funcionará em quase todos os dbms, incluindo o SQL Server. Ou seja, simplesmente SELECT "from" FROM TableName, agradável e portátil!
jarlh

Respostas:

354

Coloque o nome da coluna entre colchetes, assim, frompassa a [de].

select [from] from table;

Também é possível usar o seguinte (útil ao consultar várias tabelas):

select table.[from] from table;
tvanfosson
fonte
10
Que tal: select TableName.from from TableName; PS: Funciona no MySQL
Fabricio PH
1
Eu tentei isso esta manhã e não parecia funcionar na minha instalação do MySQL. É um parâmetro ou algo que o ativa?
CodeChimp
@CodeChimp - tente usar backticks, stackoverflow.com/questions/2901453/… Esta pergunta / resposta é específica para o MS SQL Server.
tvanfosson
Certo, mas o @FabricioPH mencionou o trabalho no MySQL. Eu encontrei aqui uma pesquisa no Google depois que tentei isso na minha instalação local do MySQL. Eu estava olhando para ver se havia uma maneira ANSI SQL genérica de escapar coisas como essa no SQL. Atualmente, estamos usando o SQL Server 2005, mas também temos o Oracle em alguns de nossos outros aplicativos. Gostaríamos de codificar nossos Java DAOs de tal maneira que, se alguma vez nos disserem que devemos mudar do SQL Server para outra coisa, isso simplesmente "funcionará".
CodeChimp
@ CodeChimp Eu posso contar o número de vezes que me aconteceu em nenhum dedo. :)
tvanfosson
25

Se estivesse no PostgreSQL, use aspas duplas ao redor do nome, como:

select "from" from "table";

Nota: Internamente, o PostgreSQL converte automaticamente todos os comandos e parâmetros não citados para minúsculas. Isso tem o efeito de que comandos e identificadores não diferenciam maiúsculas de minúsculas. sEleCt * de tAblE; é interpretado como selecionar * da tabela; . No entanto, os parâmetros dentro de aspas duplas são usados ​​como estão e, portanto, são sensíveis a maiúsculas e minúsculas: selecione * de "tabela"; e selecione * em "Tabela"; obtém o resultado de duas tabelas diferentes.

alguns
fonte
As aspas duplas também funcionam para o MS SQL, sem a distinção entre maiúsculas e minúsculas. Os identificadores citados são apenas, AFAIK, uma alternativa equivalente aos identificadores delimitados por colchetes.
P papai
As aspas duplas também funcionam para o mecanismo de consulta Presto SQL, usado pelo Athena da Amazon.
Will Humphreys
21

Enquanto você estiver fazendo isso - aliás, como outra coisa (ou melhor ainda, use uma exibição ou um SP e descontinue o antigo método de acesso direto).

SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName
Cade Roux
fonte
14

Estas são as duas maneiras de fazer isso:

  1. Use aspas como aqui:

SELECT `from` FROM TableName

  1. Você pode mencionar com o nome da tabela como:

SELECT TableName.from FROM TableName

Sunil Kapil
fonte
Obrigado! Isso salvou minha consulta de planilhas do Google que tentou extrair da coluna BY
Paul
1
Obrigado, a sintaxe de aspas duplas e colchetes não funcionou com meu cliente (MySQLWorkbench), mas o método de back tick funcionou.
kingInTheNorth 12/07/19
10

Sua pergunta parece estar bem respondida aqui, mas quero apenas adicionar mais um comentário a este assunto.

Aqueles que projetam o banco de dados devem estar cientes das palavras-chave reservadas e evitar usá-las. Se você descobrir alguém usando, informe-o sobre isso (de maneira educada). A palavra-chave aqui é palavra reservada .

Mais Informações:

"Palavras-chave reservadas não devem ser usadas como nomes de objetos. Os bancos de dados atualizados de versões anteriores do SQL Server podem conter identificadores que incluem palavras não reservadas na versão anterior, mas que são palavras reservadas para a versão atual do SQL Server. Você pode consultar o objeto usando identificadores delimitados até que o nome possa ser alterado. " http://msdn.microsoft.com/en-us/library/ms176027.aspx

e

"Se o seu banco de dados contiver nomes que correspondam a palavras-chave reservadas, você deverá usar identificadores delimitados ao se referir a esses objetos. Para obter mais informações, consulte Identificadores (DMX)." http://msdn.microsoft.com/en-us/library/ms132178.aspx

Eigir
fonte
2
Melhor ainda, use SEMPRE colchetes para seus objetos de banco de dados.
batendo
8

Se você estiver usando o SQL Server, poderá simplesmente colocar os colchetes ao redor do nome da coluna ou da tabela.

select [select]
from [table]
John Baughman
fonte
5

No Apache Drill, use aspas:

select `from` from table;
Kun Wu
fonte
3

Eu também enfrentei esse problema. E a solução para isso é colocar [Column_Name] assim na consulta.

string query= "Select [Name],[Email] from Person";

Portanto, ele funcionará perfeitamente bem.

Muneeb Hassan
fonte
3

Oi Eu trabalho em sistemas Teradata que são completamente compatíveis com ANSI. Use aspas duplas "" para nomear essas colunas.

Por exemplo, typeé uma palavra-chave reservada SQL e, quando usada entre aspas, typeé tratada como um nome especificado pelo usuário.

Veja abaixo o exemplo de código:

CREATE TABLE alpha1
AS
(
SEL
product1
type_of_product AS "type"
FROM beta1
) WITH DATA
PRIMARY INDEX (product1)

--type is a SQL reserved keyword

TYPE

--see? now to retrieve the column you would use:

SEL "type" FROM alpha1
preyingrazor
fonte
Confirmo que isso funciona no DBeaver com o banco de dados Teradata, obrigado!
Paul
1

Você pode colocar o nome da coluna entre colchetes, como:

Select  [from] from < ur_tablename>

Ou

Coloque em uma mesa temperada e use como quiser.
Exemplo:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Aqui, apenas presumo que o seu_tablename contenha apenas uma coluna (ou seja, de).

user247487
fonte
3
Isso pressupõe que essa [from]é a única coluna que your_tablenamepossui.
precisa
O que você ganha com a mesa temporária? Parece completamente inútil, nada a ver com a pergunta.
Rjmunro 17/09/2013
@rjmunro, não, isso não parece completamente inútil. Eu tenho um caso em que consulta um cubo tabular do SQL e ele retorna nomes de colunas como '[Total]'. Ou seja, o próprio nome contém '[' e ']'. Você não pode usar [[Total]] e [Total] para recuperar essa coluna. A maneira mais fácil é colocar o resultado da consulta em uma tabela temporária.
precisa saber é
@darlove Você não pode usar aspas "[Total]":? Ou talvez haja uma maneira de escapar disso, algo assim [\[Total\]]?
Rjmunro
@rjmunro, depois de ter experimentado isso um pouco, encontrei outra maneira pela qual não sabia: você pode definir QUOTED_IDENTIFIER para ON e depois usar o que está falando, as aspas duplas ". Então, é apenas mais uma caminho, mas eu não descartaria a opção tabela temporária completamente.
darlove
1

Corri no mesmo problema ao tentar atualizar uma coluna cujo nome era uma palavra - chave . A solução acima não me ajudou. Eu resolvi isso simplesmente especificando o nome da tabela assim:

UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')
Fabricio PH
fonte
1

O seguinte funcionará perfeitamente:

SELECT DISTINCT table.from AS a FROM table
user3797709
fonte
1

No MySQL, como alternativa às aspas (`), você pode usar a interface do usuário para alterar os nomes das colunas. Clique com o botão direito do mouse na tabela> Alterar tabela> Edite o nome da coluna que contém a palavra-chave sql> Confirmar.

select [from] from <table>

Como uma observação, o acima não funciona no MySQL

Anna
fonte
1

A julgar pelas respostas aqui e minha própria experiência. A única resposta aceitável, se você planeja ser portátil, não use palavras-chave SQL para tabela, coluna ou outros nomes.

Todas essas respostas funcionam nos vários bancos de dados, mas aparentemente muitas não suportam a solução ANSI.

David Bradley
fonte