Bagaimana cara menangani nama kolom SQL yang mirip dengan kata kunci SQL?

226

Salah satu kolom saya disebut from. Saya tidak dapat mengubah nama karena saya tidak berhasil. Apakah saya diizinkan untuk melakukan sesuatu seperti SELECT from FROM TableNameatau adakah sintaks khusus untuk menghindari SQL Server menjadi bingung?

Nathan H
sumber
3
Saya akan mengatakan menggunakan kutipan ganda ANSI SQL untuk pengidentifikasi terbatas. Ini akan bekerja pada hampir semua dbms, termasuk SQL Server. Yaitu cukup SELECT "from" FROM TableName, bagus dan portabel!
jarlh

Jawaban:

354

Bungkus nama kolom dalam tanda kurung seperti itu, frommenjadi [dari].

select [from] from table;

Dimungkinkan juga untuk menggunakan yang berikut (berguna ketika menanyakan beberapa tabel):

select table.[from] from table;
tvanfosson
sumber
10
Bagaimana dengan: select TableName.from from TableName; PS: Ini berfungsi di MySQL
Fabricio PH
1
Saya mencoba ini baru pagi ini, dan sepertinya tidak berhasil di instalasi MySQL saya. Apakah ini parameter atau sesuatu yang menyalakannya?
CodeChimp
@CodeChimp - coba gunakan backticks, stackoverflow.com/questions/2901453 /... Pertanyaan / jawaban ini khusus untuk MS SQL Server.
tvanfosson
Benar, tapi @FabricioPH menyebutkan itu berfungsi di MySQL. Saya kebetulan ada di sini dari pencarian Google setelah saya mencoba ini pada instalasi MySQL lokal saya. Saya mencari untuk melihat apakah ada cara umum ANSI SQL untuk melarikan diri dari hal-hal seperti ini di SQL. Kami saat ini menggunakan SQL Server 2005, tetapi kami juga memiliki Oracle di beberapa aplikasi kami yang lain. Kami ingin mengkodekan DAO Java kami sedemikian rupa sehingga jika kami diminta untuk pindah dari SQL Server ke yang lain, itu hanya akan "berfungsi".
CodeChimp
@ CodeChimp Saya dapat menghitung berapa kali yang terjadi pada saya tanpa jari. :)
tvanfosson
25

Jika sudah ada di PostgreSQL, gunakan tanda kutip ganda di sekitar nama, seperti:

select "from" from "table";

Catatan: Secara internal PostgreSQL secara otomatis mengubah semua perintah dan parameter yang tidak dikutip menjadi huruf kecil. Itu memiliki efek bahwa perintah dan pengidentifikasi tidak peka huruf besar-kecil. sEleCt * dari tAblE; ditafsirkan sebagai pilih * dari tabel; . Namun, parameter di dalam tanda kutip ganda digunakan apa adanya, dan oleh karena itu ADALAH case case: select * from "table"; dan pilih * dari "Table"; mendapat hasil dari dua tabel berbeda.

beberapa
sumber
Kutipan ganda bekerja untuk MS SQL, juga, tanpa sensitivitas case. Pengidentifikasi dikutip hanya, AFAIK, sebuah alternatif yang setara dengan pengidentifikasi dibatasi-braket.
P Ayah
Kutipan ganda juga berfungsi untuk mesin kueri SQL Presto seperti yang digunakan oleh Amazon Athena.
Will Humphreys
21

Saat Anda melakukannya - alias itu sebagai sesuatu yang lain (atau lebih baik lagi, gunakan tampilan atau SP dan hentikan metode akses langsung lama).

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

Ini adalah dua cara untuk melakukannya:

  1. Gunakan kembali kutipan seperti di sini:

PILIH `from` FROM TableName

  1. Anda dapat menyebutkan dengan nama tabel sebagai:

SELECT TableName.from FROM TableName

Sunil Kapil
sumber
Terima kasih! Ini menyelamatkan kueri lembaran google saya yang mencoba menarik dari kolom OLEH
Paul
1
Terima kasih, sintaks kuotasi dan kurung ganda tidak berfungsi dengan klien saya (MySQLWorkbench) tetapi metode centang kembali tidak.
kingInTheNorth
10

Pertanyaan Anda tampaknya dijawab dengan baik di sini, tetapi saya hanya ingin menambahkan satu lagi komentar untuk topik ini.

Mereka yang mendesain database harus benar-benar menyadari kata kunci yang dipesan dan menghindari menggunakannya. Jika Anda menemukan seseorang menggunakannya, beri tahu mereka tentang hal itu (dengan cara yang sopan). Kata kunci di sini adalah kata yang dipesan .

Informasi lebih lanjut:

"Kata kunci yang dicadangkan tidak boleh digunakan sebagai nama objek. Basis data yang ditingkatkan dari versi SQL Server sebelumnya dapat berisi pengidentifikasi yang menyertakan kata-kata yang tidak dicadangkan di versi sebelumnya, tetapi kata-kata yang dicadangkan untuk versi SQL Server saat ini. Anda dapat merujuk ke objek dengan menggunakan pengidentifikasi terbatas sampai nama dapat diubah. " http://msdn.microsoft.com/en-us/library/ms176027.aspx

dan

"Jika database Anda mengandung nama yang cocok dengan kata kunci yang dipesan, Anda harus menggunakan pengidentifikasi terbatas ketika Anda merujuk ke objek-objek itu. Untuk informasi lebih lanjut, lihat Pengidentifikasi (DMX)." http://msdn.microsoft.com/en-us/library/ms132178.aspx

Eigir
sumber
2
Lebih baik lagi SELALU menggunakan tanda kurung untuk objek basis data Anda.
membenturkan
8

Jika Anda menggunakan SQL Server, Anda cukup membungkus tanda kurung di sekitar kolom atau nama tabel.

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

Di Apache Drill, gunakan backquotes:

select `from` from table;
Kun Wu
sumber
3

Saya juga menghadapi masalah ini. Dan solusi untuk ini adalah dengan menaruh [Column_Name] seperti ini dalam permintaan.

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

Jadi itu akan bekerja dengan sangat baik.

Muneeb Hassan
sumber
3

Hai Saya bekerja pada sistem Teradata yang sepenuhnya sesuai dengan ANSI. Gunakan tanda kutip ganda "" untuk memberi nama kolom tersebut.

Misalnya type, kata kunci yang dipesan SQL, dan ketika digunakan dalam tanda kutip, typediperlakukan sebagai nama yang ditentukan pengguna.

Lihat contoh kode di bawah ini:

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
sumber
Saya mengkonfirmasi ini berfungsi di DBeaver dengan database Teradata, terima kasih!
Paul
1

Anda dapat memasukkan nama kolom Anda di braket seperti:

Select  [from] from < ur_tablename>

Atau

Taruh di tabel sementara lalu gunakan sesuka Anda.
Contoh:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Di sini saya hanya berasumsi bahwa your_tablename hanya berisi satu kolom (yaitu dari).

pengguna247487
sumber
3
Itu mengira itu [from]adalah satu-satunya kolom yang your_tablenamepunya.
Andriy M
Apa yang Anda dapatkan dari tabel sementara? Tampaknya sama sekali tidak berguna, tidak ada hubungannya dengan pertanyaan sama sekali.
rjmunro
@ rjmunro, tidak, ini sepertinya tidak sepenuhnya sia-sia. Saya punya kasus di mana saya meminta kubus tabel dari SQL dan mengembalikan nama kolom seperti '[Total].' Artinya, nama itu sendiri mengandung '[' dan ']'. Anda tidak dapat menggunakan [[Total]] dan [Total] untuk mengambil kolom seperti itu. Cara termudah adalah dengan memasukkan hasil kueri ke dalam tabel temp.
darlove
@darlove Tidak dapat Anda gunakan tanda kutip: "[Total]"? Atau mungkin ada cara untuk menghindarinya, seperti [\[Total\]]?
rjmunro
@ rjmunro, setelah bereksperimen dengan ini sedikit saya telah menemukan cara lain tentang yang saya tidak tahu: Anda dapat mengatur QUOTED_IDENTIFIER ke ON dan kemudian menggunakan apa yang Anda bicarakan, kutipan ganda ". Jadi, itu hanyalah cara lain cara tapi saya tidak akan membuang opsi temp table sepenuhnya
darlove
1

Saya mengalami masalah yang sama ketika mencoba memperbarui kolom yang namanya kata kunci . Solusi di atas tidak membantu saya. Saya memecahkannya hanya dengan menentukan nama tabel seperti ini:

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

Berikut ini akan bekerja dengan sempurna:

SELECT DISTINCT table.from AS a FROM table
pengguna3797709
sumber
1

Di MySQL, sebagai alternatif untuk menggunakan back quotes (`), Anda dapat menggunakan UI untuk mengubah nama kolom. Klik kanan tabel> Alter table> Edit nama kolom yang berisi kata kunci sql> Komit.

select [from] from <table>

Sebagai catatan, hal di atas tidak berfungsi di MySQL

Anna
sumber
1

Menilai dari jawaban di sini dan pengalaman saya sendiri. Satu-satunya jawaban yang dapat diterima, jika Anda berencana untuk portabel adalah tidak menggunakan kata kunci SQL untuk tabel, kolom, atau nama lainnya.

Semua jawaban ini bekerja di berbagai basis data tetapi tampaknya banyak yang tidak mendukung solusi ANSI.

David Bradley
sumber