Comment gérer les noms de colonnes SQL qui ressemblent à des mots clés SQL?


226

Une de mes colonnes s'appelle from . Je ne peux pas changer le nom parce que je ne l'ai pas fait. Suis-je autorisé à faire quelque chose comme SELECT from FROM TableNameou y a-t-il une syntaxe spéciale pour éviter la confusion de SQL Server?


3
Je dirais utiliser des guillemets doubles ANSI SQL pour les identificateurs délimités. Il fonctionnera sur presque tous les dbms, y compris SQL Server. C'est-à-dire tout simplement SELECT "from" FROM TableName, agréable et portable!
jarlh

Réponses:


355

Enveloppez le nom de la colonne entre crochets comme ceci, fromdevient [de].

select [from] from table;

Il est également possible d'utiliser les éléments suivants (utiles lors de l'interrogation de plusieurs tables):

select table.[from] from table;

10
Qu'en est-il: select TableName.from from TableName; PS: Cela fonctionne dans MySQL
Fabricio PH

1
J'ai essayé cela ce matin et cela ne semblait pas fonctionner dans mon installation MySQL. Est-ce un paramètre ou quelque chose qui l'allume?
CodeChimp du

@CodeChimp - essayez d'utiliser des astuces, stackoverflow.com/questions/2901453/… Cette question / réponse est spécifique à MS SQL Server.
tvanfosson

C'est vrai, mais @FabricioPH a mentionné qu'il fonctionnait dans MySQL. Je suis arrivé en face d'une recherche Google après avoir essayé cela sur mon installation MySQL locale. Je cherchais s'il y avait une façon générique SQL ANSI d'échapper à des trucs comme ça en SQL. Nous utilisons actuellement SQL Server 2005, mais nous avons également Oracle dans certaines de nos autres applications. Nous aimerions coder nos DAO Java de telle manière que si on nous disait de passer de SQL Server à autre chose, cela "fonctionnerait".
CodeChimp du

@CodeChimp Je peux compter le nombre de fois que cela m'est arrivé sans doigts. :)
tvanfosson

25

S'il avait été dans PostgreSQL, utilisez des guillemets doubles autour du nom, comme:

select "from" from "table";

Remarque: en interne, PostgreSQL convertit automatiquement toutes les commandes et paramètres non cotés en minuscules. Cela a pour effet que les commandes et les identificateurs ne sont pas sensibles à la casse. sEleCt * de la table; est interprété comme select * from table; . Cependant, les paramètres entre guillemets doubles sont utilisés tels quels et sont donc sensibles à la casse: sélectionnez * dans "table"; et sélectionnez * dans "Table"; obtient le résultat de deux tables différentes.


Les guillemets doubles fonctionnent également pour MS SQL, sans respecter la casse. Les identifiants cités sont juste, AFAIK, une alternative équivalente aux identifiants délimités par des crochets.
P Daddy,

Les guillemets doubles fonctionnent également pour le moteur de requête Presto SQL tel qu'utilisé par Athena d'Amazon.
Will Humphreys

21

Pendant que vous le faites, alias-le comme autre chose (ou mieux encore, utilisez une vue ou un SP et déconseillez l'ancienne méthode d'accès direct).

SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName

14

Ce sont les deux façons de le faire:

  1. Utilisez le retour comme ici:

SELECT `from` FROM TableName

  1. Vous pouvez mentionner avec le nom de la table:

SELECT TableName.from FROM TableName


Merci! Cela a sauvé ma requête de feuilles Google qui a essayé de tirer de la colonne BY
Paul

1
Merci, la syntaxe des guillemets doubles et des crochets ne fonctionnait pas avec mon client (MySQLWorkbench) mais la méthode de retour en arrière le faisait.
kingInTheNorth

10

Votre question semble être bien répondue ici, mais je veux juste ajouter un commentaire de plus à ce sujet.

Les concepteurs de la base de données doivent bien connaître les mots clés réservés et éviter de les utiliser. Si vous découvrez que quelqu'un l'utilise, informez-le (d'une manière polie). Le mot-clé ici est réservé mot .

Plus d'information:

"Les mots clés réservés ne doivent pas être utilisés comme noms d'objet. Les bases de données mises à niveau à partir de versions antérieures de SQL Server peuvent contenir des identificateurs qui incluent des mots non réservés dans la version antérieure, mais qui sont des mots réservés pour la version actuelle de SQL Server. Vous pouvez vous référer à la en utilisant des identificateurs délimités jusqu'à ce que le nom puisse être modifié. " http://msdn.microsoft.com/en-us/library/ms176027.aspx

et

"Si votre base de données contient des noms qui correspondent à des mots clés réservés, vous devez utiliser des identificateurs délimités lorsque vous faites référence à ces objets. Pour plus d'informations, consultez Identificateurs (DMX)." http://msdn.microsoft.com/en-us/library/ms132178.aspx


2
Mieux encore, utilisez TOUJOURS des crochets pour vos objets de base de données.
frapper le

8

Si vous utilisez SQL Server, vous pouvez simplement envelopper les crochets autour du nom de la colonne ou de la table.

select [select]
from [table]

5

Dans Apache Drill, utilisez des guillemets:

select `from` from table;

3

J'ai également fait face à ce problème. Et la solution pour cela est de mettre [Column_Name] comme ceci dans la requête.

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

Cela fonctionnera donc parfaitement bien.


3

Salut, je travaille sur des systèmes Teradata qui sont entièrement conformes à la norme ANSI. Utilisez des guillemets doubles "" pour nommer ces colonnes.

Par exemple, typeest un mot clé réservé SQL, et lorsqu'il est utilisé entre guillemets,type est traité comme un nom spécifié par l'utilisateur.

Voir l'exemple de code ci-dessous:

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

Je confirme que cela fonctionne dans DBeaver avec la base de données Teradata, merci!
Paul

1

Vous pouvez mettre le nom de votre colonne entre parenthèses comme:

Select  [from] from < ur_tablename>

Ou

Mettez dans une table temporaire puis utilisez comme vous le souhaitez.
Exemple:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Ici, je suppose simplement que your_tablename ne contient qu'une seule colonne (c'est-à-dire de).


3
Cela suppose que [from]c'est la seule colonne qui your_tablenamea.
Andriy M

Que gagnez-vous de la table temporaire? Cela semble complètement inutile, rien à voir avec la question.
rjmunro

@rjmunro, non, cela ne semble pas complètement inutile. J'ai un cas où je demande un cube tabulaire à partir de SQL et il renvoie des noms de colonnes comme «[Total]». Autrement dit, le nom lui-même contient «[» et «]». Vous ne pouvez pas utiliser [[Total]] et [Total] pour récupérer une telle colonne. Le moyen le plus simple consiste à placer le résultat de la requête dans une table temporaire.
darlove

@darlove vous ne pouvez pas utiliser les guillemets "[Total]"? Ou peut-être existe-t-il un moyen de lui échapper, quelque chose comme ça [\[Total\]]?
rjmunro

@rjmunro, après avoir expérimenté cela un peu, j'ai trouvé une autre façon dont je ne savais pas: vous pouvez régler QUOTED_IDENTIFIER sur ON et ensuite utiliser ce dont vous parlez, la citation double ". Donc, c'est juste une autre mais je ne supprimerais pas complètement l'option de table temporaire.
darlove

1

J'ai rencontré le même problème en essayant de mettre à jour une colonne dont le nom était un mot - clé . La solution ci-dessus ne m'a pas aidé. Je l'ai résolu en spécifiant simplement le nom de la table comme ceci:

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

1

Les éléments suivants fonctionneront parfaitement:

SELECT DISTINCT table.from AS a FROM table

1

Dans MySQL, alternativement à l'utilisation de guillemets (`), vous pouvez utiliser l'interface utilisateur pour modifier les noms des colonnes. Cliquez avec le bouton droit sur le tableau> Modifier le tableau> Modifier le nom de la colonne qui contient le mot clé sql> Valider.

select [from] from <table>

Notez que ce qui précède ne fonctionne pas dans MySQL


1

A en juger par les réponses ici et ma propre expérience. La seule réponse acceptable, si vous prévoyez d'être portable est de ne pas utiliser de mots clés SQL pour les noms de table, de colonne ou autres.

Toutes ces réponses fonctionnent dans les différentes bases de données mais apparemment, beaucoup ne prennent pas en charge la solution ANSI.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.