¿Cómo lidiar con los nombres de columna SQL que parecen palabras clave SQL?

226

Se llama una de mis columnas from. No puedo cambiar el nombre porque no lo hice. ¿Puedo hacer algo como SELECT from FROM TableNameo hay una sintaxis especial para evitar que se confunda SQL Server?

Nathan H
fuente
3
Yo diría que use las comillas dobles de ANSI SQL para los identificadores delimitados. Funcionará en casi cualquier dbms, incluido SQL Server. Es decir, simplemente SELECT "from" FROM TableName, agradable y portátil!
jarlh

Respuestas:

355

Envuelva el nombre de la columna entre paréntesis de esta manera, se fromconvierte en [desde].

select [from] from table;

También es posible usar lo siguiente (útil cuando se consultan varias tablas):

select table.[from] from table;
tvanfosson
fuente
10
Qué pasa con: select TableName.from from TableName; PD: Funciona en MySQL
Fabricio PH
1
Intenté esto esta mañana, y no parecía funcionar en mi instalación de MySQL. ¿Es un parámetro o algo que lo enciende?
CodeChimp
@CodeChimp: intente utilizar backticks, stackoverflow.com/questions/2901453/… Esta pregunta / respuesta es específica de MS SQL Server.
tvanfosson
Correcto, pero @FabricioPH lo mencionó trabajando en MySQL. Sucedí aquí desde una búsqueda en Google después de probar esto en mi instalación local de MySQL. Estaba buscando para ver si había una forma genérica ANSI SQL de escapar de cosas como esta en SQL. Actualmente estamos usando SQL Server 2005, pero también tenemos Oracle en algunas de nuestras otras aplicaciones. Nos gustaría codificar nuestros DAO de Java de tal manera que si alguna vez se nos dijera que pasáramos de SQL Server a otra cosa, simplemente "funcionaría".
CodeChimp
@CodeChimp Puedo contar la cantidad de veces que me ha pasado sin dedos. :)
tvanfosson
25

Si hubiera estado en PostgreSQL, use comillas dobles alrededor del nombre, como:

select "from" from "table";

Nota: Internamente PostgreSQL convierte automáticamente todos los comandos y parámetros sin comillas en minúsculas. Eso tiene el efecto de que los comandos e identificadores no distinguen entre mayúsculas y minúsculas. sEleCt * de tAblE; se interpreta como select * de la tabla; . Sin embargo, los parámetros dentro de las comillas dobles se usan tal cual y, por lo tanto, SON sensibles a mayúsculas y minúsculas: seleccione * de "tabla"; y seleccione * de "Tabla"; obtiene el resultado de dos tablas diferentes.

algunos
fuente
Sin embargo, las comillas dobles también funcionan para MS SQL, sin la distinción entre mayúsculas y minúsculas. Los identificadores citados son simplemente, AFAIK, una alternativa equivalente a los identificadores delimitados por paréntesis.
P Daddy
Las comillas dobles también funcionan para el motor de consulta SQL de Presto como lo usa Athena de Amazon.
Will Humphreys
21

Mientras lo hace, alias como otra cosa (o mejor aún, use una vista o un SP y desaproveche el antiguo método de acceso directo).

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

Estas son las dos formas de hacerlo:

  1. Use la cita posterior como aquí:

SELECCIONE `from` FROM TableName

  1. Puede mencionar con el nombre de la tabla como:

SELECT TableName.from FROM TableName

Sunil Kapil
fuente
¡Gracias! Esto salvó mi consulta de hojas de Google que intentó extraer de la columna BY
Paul
1
Gracias, la sintaxis de comillas dobles y corchetes no funcionó con mi cliente (MySQLWorkbench), pero el método de marcación inversa sí.
kingInTheNorth
10

Su pregunta parece estar bien respondida aquí, pero solo quiero agregar un comentario más a este tema.

Aquellos que diseñan la base de datos deben conocer las palabras clave reservadas y evitar usarlas. Si descubre que alguien lo está usando, infórmele (de manera educada). La palabra clave aquí es palabra reservada .

Más información:

"Las palabras clave reservadas no deben usarse como nombres de objeto. Las bases de datos actualizadas de versiones anteriores de SQL Server pueden contener identificadores que incluyen palabras no reservadas en la versión anterior, pero que son palabras reservadas para la versión actual de SQL Server. Puede consultar el objeto utilizando identificadores delimitados hasta que se pueda cambiar el nombre ". http://msdn.microsoft.com/en-us/library/ms176027.aspx

y

"Si su base de datos contiene nombres que coinciden con palabras clave reservadas, debe usar identificadores delimitados cuando se refiera a esos objetos. Para obtener más información, consulte Identificadores (DMX)". http://msdn.microsoft.com/en-us/library/ms132178.aspx

Eigir
fuente
2
Mejor aún, SIEMPRE use corchetes para los objetos de su base de datos.
golpeando el
8

Si está utilizando SQL Server, simplemente puede colocar los corchetes alrededor del nombre de la columna o tabla.

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

En Apache Drill, use comillas inversas:

select `from` from table;
Kun Wu
fuente
3

También me he enfrentado a este problema. Y la solución para esto es poner [Column_Name] como este en la consulta.

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

Entonces funcionará perfectamente bien.

Muneeb Hassan
fuente
3

Hola, trabajo en sistemas Teradata que son completamente compatibles con ANSI. Use comillas dobles "" para nombrar tales columnas.

Por ejemplo, typees una palabra clave reservada de SQL, y cuando se usa entre comillas, typese trata como un nombre especificado por el usuario.

Vea el siguiente ejemplo 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
fuente
Confirmo que esto funciona en DBeaver con la base de datos Teradata, ¡gracias!
Paul
1

Puede poner el nombre de su columna entre paréntesis como:

Select  [from] from < ur_tablename>

O

Poner en una tabla temporal y luego usar como quieras.
Ejemplo:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Aquí solo asumo que your_tablename contiene solo una columna (es decir, from).

usuario247487
fuente
3
Eso supone que [from]es la única columna que your_tablenametiene.
Andriy M
¿Qué obtienes de la tabla temporal? Parece completamente inútil, nada que ver con la pregunta en absoluto.
rjmunro
@rjmunro, no, esto no parece completamente inútil. Tengo un caso en el que consulto un cubo tabular desde SQL y me devuelve nombres de columnas como '[Total]'. Es decir, el nombre en sí contiene '[' y ']'. No puede usar [[Total]] y [Total] para recuperar dicha columna. La forma más fácil es poner el resultado de la consulta en una tabla temporal.
darlove el
@darlove ¿No puedes usar comillas "[Total]"? ¿O tal vez hay una forma de escapar, algo así [\[Total\]]?
rjmunro
@rjmunro, después de haber experimentado un poco con esto, he encontrado otra forma sobre la que no sabía: puedes configurar QUOTED_IDENTIFIER en ON y luego usar lo que estás hablando, la comilla doble ". Entonces, es solo otra pero no descartaría completamente la opción de tabla temporal.
Darlove
1

Me encontré con el mismo problema al intentar actualizar una columna cuyo nombre era una palabra clave . La solución anterior no me ayudó. Lo resolví simplemente especificando el nombre de la tabla de esta manera:

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

Lo siguiente funcionará perfectamente:

SELECT DISTINCT table.from AS a FROM table
usuario3797709
fuente
1

En MySQL, como alternativa al uso de comillas inversas (`), puede usar la interfaz de usuario para alterar los nombres de columna. Haga clic con el botón derecho en la tabla> Modificar tabla> Editar el nombre de columna que contiene la palabra clave sql> Confirmar.

select [from] from <table>

Como nota, lo anterior no funciona en MySQL

Anna
fuente
1

A juzgar por las respuestas aquí y mi propia experiencia. La única respuesta aceptable, si planea ser portátil, no use palabras clave SQL para la tabla, columna u otros nombres.

Todas estas respuestas funcionan en varias bases de datos, pero aparentemente muchas no son compatibles con la solución ANSI.

David Bradley
fuente