วิธีจัดการกับชื่อคอลัมน์ SQL ที่ดูเหมือนคำสำคัญ SQL


226

fromหนึ่งในคอลัมน์ของฉันถูกเรียกว่า ฉันไม่สามารถเปลี่ยนชื่อได้เพราะฉันไม่ได้ทำ ฉันได้รับอนุญาตให้ทำสิ่งที่ชอบSELECT from FROM TableNameหรือมีไวยากรณ์พิเศษเพื่อหลีกเลี่ยงการ SQL Server สับสนหรือไม่


3
ฉันว่าจะใช้อัญประกาศคู่ ANSI SQL สำหรับตัวระบุที่คั่น มันจะทำงานได้เกือบทุก dbms รวมถึง SQL Server SELECT "from" FROM TableNameนั่นก็คือทำดีและพกพา!
jarlh

คำตอบ:


354

ตัดชื่อคอลัมน์ในวงเล็บอย่างนั้นfromกลายเป็น [จาก]

select [from] from table;

นอกจากนี้ยังเป็นไปได้ที่จะใช้สิ่งต่อไปนี้ (มีประโยชน์เมื่อทำการสอบถามหลายตาราง):

select table.[from] from table;

10
สิ่งที่เกี่ยวกับ: select TableName.from from TableName; PS: มันทำงานใน MySQL
Fabricio PH

1
ฉันลองมาเมื่อเช้านี้และดูเหมือนว่ามันจะไม่ทำงานในการติดตั้ง MySQL ของฉัน มันเป็นพารามิเตอร์หรือสิ่งที่เปิดอยู่?
CodeChimp

@CodeChimp - ลองใช้ backticks, stackoverflow.com/questions/2901453/… คำถาม / คำตอบนี้เฉพาะกับ MS SQL Server
tvanfosson

ถูกต้อง แต่ @FabricioPH กล่าวถึงมันทำงานใน MySQL ฉันเกิดขึ้นตรงข้ามกับการค้นหาโดย Google หลังจากลองติดตั้ง MySQL ในพื้นที่ของฉัน ฉันต้องการตรวจสอบว่ามีวิธี ANSI SQL ทั่วไปในการหลบหนีสิ่งเช่นนี้ใน SQL หรือไม่ ขณะนี้เรากำลังใช้ SQL Server 2005 แต่เรายังมี Oracle ในแอพอื่น ๆ ของเราด้วย เราต้องการโค้ด Java DAO ของเราในลักษณะที่ถ้าเราเคยถูกบอกให้ย้ายจาก SQL Server ไปยังสิ่งอื่นมันจะ "ทำงาน"
CodeChimp

@CodeChimp ฉันสามารถนับจำนวนครั้งที่เกิดขึ้นกับฉันได้โดยไม่ต้องใช้นิ้ว :)
tvanfosson

25

หากอยู่ใน PostgreSQL ให้ใช้เครื่องหมายอัญประกาศคู่ล้อมรอบชื่อเช่น:

select "from" from "table";

หมายเหตุ: ภายใน PostgreSQL จะแปลงคำสั่งและพารามิเตอร์ที่ไม่มีเครื่องหมายทั้งหมดให้เป็นตัวพิมพ์เล็กโดยอัตโนมัติ ที่มีผลกระทบที่คำสั่งและตัวบ่งชี้ไม่คำนึงถึงขนาดตัวพิมพ์ sEleCt * จาก tAblE; ถูกตีความเป็นการเลือก * จากตาราง; . อย่างไรก็ตามพารามิเตอร์ที่อยู่ในเครื่องหมายคำพูดคู่จะถูกใช้ตามที่เป็นอยู่และดังนั้นจึงคำนึงถึงขนาดตัวพิมพ์: เลือก * จาก "ตาราง"; และเลือก * จาก "ตาราง"; รับผลลัพธ์จากสองตารางที่แตกต่างกัน


เครื่องหมายคำพูดคู่ใช้ได้กับ MS SQL เช่นกันโดยไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ตัวระบุที่อ้างถึงเป็นเพียง AFAIK ทางเลือกที่เทียบเท่ากับตัวระบุที่คั่นด้วยวงเล็บ
P Daddy

เครื่องหมายคำพูดคู่ยังใช้กับเคียวรี Presto SQL ที่ใช้โดย Athena ของ Amazon
Will Humphreys

21

ในขณะที่คุณกำลังทำ - นามแฝงว่ามันเป็นอย่างอื่น (หรือดีกว่ายังใช้มุมมองหรือ SP และเลิกใช้วิธีการเข้าถึงโดยตรงเก่า)

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

14

นี่คือสองวิธีในการทำ:

  1. ใช้เครื่องหมายคำพูดย้อนกลับตามที่นี่:

เลือก `จาก 'จาก TableName

  1. คุณสามารถพูดถึงด้วยชื่อตารางเป็น:

SELECT TableName.from FROM TableName


ขอบคุณ! สิ่งนี้บันทึกการสืบค้น google ชีตของฉันที่พยายามดึงออกมาจากคอลัมน์ BY
Paul

1
ขอบคุณไวยากรณ์ของเครื่องหมายคำพูดคู่และวงเล็บเหลี่ยมไม่ทำงานกับลูกค้าของฉัน (MySQLWorkbench) แต่วิธีติ๊กด้านหลังทำได้
kingInTheNorth

10

ดูเหมือนว่าคำถามของคุณจะได้รับคำตอบที่ดี แต่ฉันต้องการเพิ่มความคิดเห็นเพิ่มเติมในหัวข้อนี้

ผู้ออกแบบฐานข้อมูลควรตระหนักถึงคำสำคัญที่สงวนไว้และหลีกเลี่ยงการใช้คำสำคัญเหล่านั้น หากคุณค้นพบใครบางคนที่ใช้มันแจ้งให้พวกเขาเกี่ยวกับมัน (ในทางที่สุภาพ) คำหลักที่นี่เป็นคำที่สงวนไว้

ข้อมูลมากกว่านี้:

"ไม่ควรใช้คำหลักที่สำรองไว้เป็นชื่อวัตถุฐานข้อมูลที่ปรับรุ่นจาก SQL Server รุ่นก่อนหน้าอาจมีตัวระบุที่มีคำที่ไม่ได้จองไว้ในรุ่นก่อนหน้า แต่เป็นคำที่สงวนไว้สำหรับ SQL Server รุ่นปัจจุบันคุณสามารถอ้างถึง วัตถุโดยใช้ตัวระบุที่มีการคั่นจนกว่าชื่อสามารถเปลี่ยนแปลงได้ " http://msdn.microsoft.com/en-us/library/ms176027.aspx

และ

"ถ้าฐานข้อมูลของคุณมีชื่อที่ตรงกับคำสำคัญที่สงวนไว้คุณต้องใช้ตัวระบุที่คั่นด้วยเมื่อคุณอ้างถึงวัตถุเหล่านั้นสำหรับข้อมูลเพิ่มเติมดูตัวระบุ (DMX)" http://msdn.microsoft.com/en-us/library/ms132178.aspx


2
ยังดีกว่าเสมอใช้วงเล็บสำหรับวัตถุฐานข้อมูลของคุณ
ต่อสู้

8

หากคุณใช้ SQL Server คุณสามารถตัดวงเล็บเหลี่ยมรอบชื่อคอลัมน์หรือตารางได้

select [select]
from [table]


3

ฉันยังต้องเผชิญกับปัญหานี้ และวิธีแก้ปัญหานี้คือการใส่ [Column_Name] เช่นนี้ไว้ในแบบสอบถาม

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

ดังนั้นมันจะทำงานได้อย่างสมบูรณ์แบบดี


3

สวัสดีฉันทำงานกับระบบ Teradata ที่สอดคล้องกับ ANSI อย่างสมบูรณ์ ใช้เครื่องหมายคำพูดคู่ "" เพื่อตั้งชื่อคอลัมน์ดังกล่าว

เช่นtypeเป็นคำหลักที่สงวนไว้ของ SQL และเมื่อใช้ภายในเครื่องหมายคำพูดtypeจะถือว่าเป็นชื่อที่ผู้ใช้ระบุ

ดูตัวอย่างโค้ดด้านล่าง:

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

ฉันยืนยันว่างานนี้ใน DBeaver พร้อมฐานข้อมูล Teradata ขอบคุณ!
Paul

1

คุณสามารถใส่ชื่อคอลัมน์ของคุณในวงเล็บเช่น:

Select  [from] from < ur_tablename>

หรือ

ใส่ในตาราง temprary จากนั้นใช้เท่าที่คุณต้องการ
ตัวอย่าง:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

ที่นี่ฉันแค่คิดว่า your_tablename มีเพียงหนึ่งคอลัมน์ (เช่นจาก)


3
ทึกทักว่า[from]เป็นคอลัมน์เดียวที่your_tablenameได้รับ
Andriy M

คุณได้อะไรจากตารางชั่วคราว ดูเหมือนว่าไร้ประโยชน์อย่างสมบูรณ์ไม่มีอะไรเกี่ยวข้องกับคำถามเลย
rjmunro

@rjmunro ไม่นี่ดูไม่ไร้ประโยชน์อย่างสมบูรณ์ ฉันมีกรณีที่ฉันสอบถามคิวบ์คิวบ์จาก SQL และส่งคืนชื่อคอลัมน์เช่น '[รวม]' นั่นคือชื่อตัวเองมี '[' และ ']' คุณไม่สามารถใช้ [[ทั้งหมด]] และ [ทั้งหมด] เพื่อดึงข้อมูลคอลัมน์ดังกล่าว วิธีที่ง่ายที่สุดคือการใส่ผลลัพธ์ของแบบสอบถามลงในตารางชั่วคราว
darlove

@darlove คุณไม่สามารถใช้คำพูด: "[Total]"? หรืออาจจะมีวิธีที่จะหลบหนีมันเป็น[\[Total\]]อย่างไร
rjmunro

@rjmunro หลังจากทดลองใช้งานแล้วฉันพบวิธีอื่นที่ฉันไม่รู้: คุณสามารถตั้งค่า QUOTED_IDENTIFIER เป็น ON แล้วใช้สิ่งที่คุณพูดถึงเครื่องหมายคำพูดคู่ "ดังนั้นมันจึงเป็นอีก วิธี แต่ฉันจะไม่ละทิ้งตัวเลือกตารางอุณหภูมิอย่างสมบูรณ์ #
499

1

ฉันวิ่งเข้าไปในปัญหาเดียวกันเมื่อพยายามที่จะปรับปรุงคอลัมน์ที่ชื่อเป็นคำหลัก การแก้ปัญหาข้างต้นไม่ได้ช่วยฉัน ฉันแก้ไขมันโดยเพียงแค่ระบุชื่อของตารางดังนี้:

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


1

ใน MySQL หรือใช้ back quote (`) คุณสามารถใช้ UI เพื่อเปลี่ยนชื่อคอลัมน์ คลิกขวาที่ตาราง> แก้ไขตาราง> แก้ไขชื่อคอลัมน์ที่มีคำหลัก sql> กระทำ

select [from] from <table>

ตามหมายเหตุข้างต้นไม่ทำงานใน MySQL


1

ตัดสินจากคำตอบที่นี่และประสบการณ์ของฉันเอง คำตอบเดียวที่ยอมรับได้หากคุณวางแผนที่จะพกพาไม่ได้ใช้คำหลัก SQL สำหรับตารางคอลัมน์หรือชื่ออื่น

คำตอบทั้งหมดเหล่านี้ทำงานในฐานข้อมูลต่าง ๆ แต่เห็นได้ชัดว่าไม่สนับสนุน ANSI มากนัก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.