SQL anahtar kelimelerine benzeyen SQL sütun adları ile nasıl başa çıkılır?


226

Sütunlarımdan biri denir from. Adı değiştiremem çünkü yapmadım. SELECT from FROM TableNameSQL Server'ın karışmasını önlemek için özel bir sözdizimi gibi bir şey yapmama izin veriliyor mu?


3
Sınırlı tanımlayıcılar için ANSI SQL çift tırnak kullanın söyleyebilirim. SQL Server da dahil olmak üzere hemen hemen her dbms üzerinde çalışacaktır. Yani basitçe SELECT "from" FROM TableName, güzel ve taşınabilir!
jarlh

Yanıtlar:


356

Sütun adını parantez içine fromalın.

select [from] from table;

Aşağıdakileri kullanmak da mümkündür (birden çok tablo sorgulanırken yararlıdır):

select table.[from] from table;

10
Peki ya: select TableName.from from TableName; PS:
MySQL'de

1
Bunu sadece bu sabah denedim ve MySQL kurulumumda işe yaramadı. Bu bir parametre mi yoksa onu açan bir şey mi?
CodeChimp

@CodeChimp - backticks kullanmayı deneyin, stackoverflow.com/questions/2901453/… Bu soru / cevap MS SQL Server'a özgüdür.
tvanfosson

Doğru, ama @FabricioPH MySQL'de çalıştığını söyledi. Bunu yerel MySQL kurulumumda denedikten sonra bir Google aramasından geçtim. SQL böyle şeyler kaçan genel bir ANSI SQL yolu olup olmadığını görmek için bakıyordu. Şu anda SQL Server 2005 kullanıyoruz, ancak bazı diğer uygulamalarımızda Oracle da var. Java DAO'larımızı öyle bir şekilde kodlamak istiyoruz ki, SQL Server'dan başka bir şeye geçmemizi söylersek, sadece "işe yarar".
CodeChimp

@CodeChimp Parmaklarımın başına kaç kez geldiğini sayabilirim. :)
tvanfosson

25

PostgreSQL'de olsaydı, adın etrafında çift tırnak kullanın, örneğin:

select "from" from "table";

Not: Dahili olarak PostgreSQL, sıralanmamış tüm komutları ve parametreleri otomatik olarak küçük harfe dönüştürür. Komutların ve tanımlayıcıların büyük / küçük harfe duyarlı olmaması etkisi vardır. tAblE'den sEleCt *; tablodan select * olarak yorumlanır ; . Ancak, çift tırnak içindeki parametreler olduğu gibi kullanılır ve bu nedenle büyük / küçük harfe duyarlıdır: "tablo" dan * seçin; ve "Tablo" dan * seçin; sonucu iki farklı tablodan alır.


Çift tırnak, MS SQL için de büyük / küçük harf duyarlılığı olmadan çalışır. Alıntılanan tanımlayıcılar, parantezle sınırlanmış tanımlayıcılara eşdeğer bir alternatif olan AFAIK'tır.
P Daddy

Çift tırnak işaretleri Amazon'un Athena tarafından kullanılan Presto SQL sorgu motoru için de çalışır.
Humphreys

21

Bunu yaparken - başka bir şey olarak takma (veya daha iyisi, bir görünüm veya SP kullanın ve eski doğrudan erişim yöntemini kullanımdan kaldırın).

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

14

Bunu yapmanın iki yolu şunlardır:

  1. Burada olduğu gibi geri alıntı kullanın:

TableName 'dan' SEÇ

  1. Tablo adıyla şu şekilde bahsedebilirsiniz:

SELECT TableName.from FROM TableName


Teşekkürler! Bu, BY sütunundan almaya çalışan google sayfaları
Paul

1
Teşekkürler, çift tırnak ve köşeli ayraç sözdizimi benim müşteri (MySQLWorkbench) ile işe yaramadı ama arka kene yöntemi işe yaramadı.
kingInTheNorth

10

Sorunuz burada iyi yanıtlanmış gibi görünüyor, ancak bu konuya bir yorum daha eklemek istiyorum.

Veritabanını tasarlayanlar ayrılmış anahtar kelimelerin farkında olmalı ve bunları kullanmaktan kaçınmalıdır. Kullanan birini keşfederseniz, onları (kibar bir şekilde) bilgilendirin. Buradaki anahtar kelime ayrılmış kelimedir.

Daha fazla bilgi:

"Ayrılmış anahtar kelimeler nesne adı olarak kullanılmamalıdır. SQL Server'ın önceki sürümlerinden yükseltilen veritabanları, önceki sürümde ayrılmış olmayan ancak SQL Server'ın geçerli sürümü için ayrılmış sözcükler içeren tanımlayıcılar içerebilir. nesne, ad değiştirilinceye kadar sınırlandırılmış tanımlayıcılar kullanarak. " http://msdn.microsoft.com/en-us/library/ms176027.aspx

ve

"Veritabanınız ayrılmış anahtar kelimelerle eşleşen adlar içeriyorsa, bu nesnelere başvururken sınırlandırılmış tanımlayıcılar kullanmanız gerekir. Daha fazla bilgi için bkz. Tanımlayıcılar (DMX)." http://msdn.microsoft.com/en-us/library/ms132178.aspx


2
Daha da iyisi, veritabanı nesneleriniz için HER ZAMAN köşeli parantez kullanın.
vurarak

8

SQL Server kullanıyorsanız, köşeli parantezleri sütun veya tablo adının etrafına sarabilirsiniz.

select [select]
from [table]

5

Apache Drill'de geri tırnak kullanın:

select `from` from table;

3

Ben de bu sorunla karşılaştım. Bunun çözümü de [Column_Name] sorgusunu sorguya koymaktır.

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

Bu yüzden mükemmel bir şekilde çalışacaktır.


3

Merhaba ben tamamen ANSI uyumlu Teradata sistemleri üzerinde çalışıyorum. Bu tür sütunları adlandırmak için çift tırnak işareti "" kullanın.

Örn. typeSQL ayrılmış bir anahtar kelimedir ve tırnak işaretleri içinde kullanıldığında typekullanıcı tarafından belirtilen ad olarak değerlendirilir.

Aşağıdaki kod örneğine bakın:

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

Bunun Teradata veritabanı ile DBeaver'da çalıştığını onaylıyorum, teşekkürler!
Paul

1

Sütun adınızı aşağıdaki gibi parantez içine alabilirsiniz:

Select  [from] from < ur_tablename>

Veya

Bir geçici tablo koyun ve sonra istediğiniz gibi kullanın.
Misal:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Burada sadece sizin_tablename sadece bir sütun (yani) içerdiğini varsayalım.


3
Bu [from]var olan tek sütun olduğunu varsayar your_tablename.
Andriy M

Geçici tablodan ne kazanıyorsunuz? Bu tamamen işe yaramaz gibi görünüyor, soru ile hiç ilgisi yok.
rjmunro

@rjmunro, hayır, bu tamamen işe yaramaz görünmüyor. SQL'den sekmeli bir küp sorgulamak ve '[Toplam]' gibi sütun adlarını döndürür bir durum var. Yani, adın kendisi '[' ve ']' içerir. Böyle bir sütunu almak için [[Toplam]] ve [Toplam] kullanamazsınız. En kolay yol, sorgunun sonucunu geçici tabloya koymaktır.
darlove

@darlove Eğer tırnak kullanılamaz: "[Total]"? Ya da belki ondan kaçmanın bir yolu var [\[Total\]]mı?
rjmunro

@rjmunro, bunu biraz denedikten sonra, bilmediğim başka bir yol buldum: QUOTED_IDENTIFIER'ı ON olarak ayarlayabilir ve sonra bahsettiğiniz şeyi, çift alıntıyı kullanabilirsiniz ". ama geçici tablo seçeneğini tamamen
atmazdım

1

Anahtar kelime olan bir sütunu güncellemeye çalışırken de aynı sorunla karşılaştım . Yukarıdaki çözüm bana yardımcı olmadı. Sadece tablonun adını şöyle belirterek çözdüm:

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

1

Aşağıdakiler mükemmel bir şekilde çalışacaktır:

SELECT DISTINCT table.from AS a FROM table

1

MySQL'de, geri tırnak işaretleri (`) kullanmaya alternatif olarak, sütun adlarını değiştirmek için kullanıcı arayüzünü kullanabilirsiniz. Tablo> Tabloyu değiştir> sql anahtar sözcüğünü içeren sütun adını düzenle> Tamam'ı sağ tıklayın.

select [from] from <table>

Not olarak, yukarıdakiler MySQL'de çalışmaz


1

Buradaki cevaplara ve kendi tecrübelerime bakılırsa. Kabul edilebilir tek yanıt, taşınabilir olmayı planlıyorsanız tablo, sütun veya diğer adlar için SQL anahtar sözcükleri kullanmayın.

Tüm bu yanıtlar çeşitli veritabanlarında çalışır, ancak görünüşe göre çok fazla ANSI çözümünü desteklememektedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.