SQL कीवर्ड के समान दिखने वाले SQL कॉलम नामों से कैसे निपटें?


226

मेरा एक कॉलम कहा जाता है from। मैं नाम नहीं बदल सकता क्योंकि मैंने इसे नहीं बनाया। क्या मुझे ऐसा कुछ करने की अनुमति है SELECT from FROM TableNameया SQL सर्वर को भ्रमित होने से बचाने के लिए कोई विशेष वाक्यविन्यास है?


3
मैं कहूंगा कि सीमांकित पहचानकर्ताओं के लिए ANSI SQL के दोहरे उद्धरण चिह्नों का उपयोग करेंगे। यह SQL सर्वर सहित लगभग किसी भी dbms पर काम करेगा। यानी बस करो SELECT "from" FROM TableName, अच्छा और पोर्टेबल!
jarlh

जवाबों:


354

कोष्ठक में स्तंभ नाम लपेटें जैसे, from[से] बन जाता है।

select [from] from table;

निम्नलिखित का उपयोग करना भी संभव है (कई तालिकाओं को क्वेरी करते समय उपयोगी):

select table.[from] from table;

10
क्या के बारे में: select TableName.from from TableName; पुनश्च: यह MySQL में काम करता है
Fabricio PH

1
मैंने आज सुबह ही इसकी कोशिश की, और यह मेरे MySQL स्थापना में काम नहीं आया। क्या यह एक पैरामीटर या कुछ ऐसा है जो इसे चालू करता है?
कोडकम्प

@CodeChimp - backticks, stackoverflow.com/questions/2901453/… का उपयोग करने का प्रयास करें। यह प्रश्न / उत्तर MS SQL सर्वर के लिए विशिष्ट है।
तवान्फोसन

सही है, लेकिन @FabricioPH ने MySQL में काम करने का उल्लेख किया है। जब मैंने अपने स्थानीय MySQL इंस्टॉल पर यह कोशिश की, तो मैं एक Google खोज से यहाँ हुआ। मैं यह देखना चाह रहा था कि क्या एससीएसआई एसक्यूएल एसक्यूएल में इस तरह से सामान भागने का रास्ता है। हम वर्तमान में SQL Server 2005 का उपयोग कर रहे हैं, लेकिन हमारे पास हमारे कुछ अन्य ऐप में Oracle भी हैं। हम अपने जावा DAO को इस तरह कोडित करना चाहेंगे कि अगर हमें कभी SQL सर्वर से किसी और चीज़ में जाने के लिए कहा जाए, तो यह सिर्फ "काम" होगा।
कोडशिम

@CodeChimp मैं कई बार उंगलियों पर मेरे साथ हुई संख्या की गिनती कर सकता हूं। :)
tvanfosson

25

यदि यह PostgreSQL में था, तो नाम के आसपास दोहरे उद्धरण चिह्नों का उपयोग करें, जैसे:

select "from" from "table";

नोट: आंतरिक रूप से PostgreSQL स्वचालित रूप से सभी अनछुए कमांड और पैरामीटर को लोअर केस में कनवर्ट करता है। इसका प्रभाव यह है कि कमांड और पहचानकर्ता संवेदनशील नहीं होते हैं। sEleCt * tAblE से; तालिका के रूप में चयन * के रूप में व्याख्या की गई है; । हालांकि, दोहरे उद्धरण चिह्नों के अंदर मापदंडों का उपयोग किया जाता है, और इसलिए मामला संवेदनशील है: "तालिका" से * का चयन करें; और "तालिका" से * चुनें; दो अलग-अलग तालिकाओं से परिणाम मिलता है।


एमएस सक्सेस के लिए डबल कोट्स केस सेंसिटिविटी के बिना भी काम करते हैं। उद्धृत पहचानकर्ता बस हैं, AFAIK, ब्रैकेट-सीमांकित पहचानकर्ताओं के बराबर विकल्प।
पी डैडी

डबल कोट्स प्रिस्टो SQL क्वेरी इंजन के लिए भी काम करता है जैसा कि अमेज़न के एथेना द्वारा उपयोग किया जाता है।
विल हम्फ्रीज

21

जब आप इसे कर रहे हैं - इसे कुछ और के रूप में (या फिर अभी तक बेहतर है, एक दृश्य या एक एसपी का उपयोग करें और पुराने प्रत्यक्ष अभिगम विधि को हटा दें)।

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 सर्वर के पुराने संस्करणों से अपग्रेड किए गए डेटाबेस में ऐसे पहचानकर्ता हो सकते हैं, जिनमें पहले संस्करण में आरक्षित शब्द शामिल नहीं हैं, लेकिन यह SQL सर्वर के वर्तमान संस्करण के लिए आरक्षित शब्द हैं। आप इसका उल्लेख कर सकते हैं। जब तक नाम नहीं बदला जा सकता है तब तक सीमांकित पहचानकर्ताओं का उपयोग करके वस्तु। http://msdn.microsoft.com/en-us/library/ms176027.aspx

तथा

"यदि आपके डेटाबेस में आरक्षित कीवर्ड से मेल खाने वाले नाम हैं, तो आपको उन वस्तुओं का संदर्भ देते समय सीमांकित पहचानकर्ता का उपयोग करना होगा। अधिक जानकारी के लिए, पहचानकर्ता (DMX) देखें।" http://msdn.microsoft.com/en-us/library/ms132178.aspx


2
बेहतर अभी तक हमेशा अपने डेटाबेस वस्तुओं के लिए कोष्ठक का उपयोग करें।
पीटना

8

यदि आप SQL सर्वर का उपयोग कर रहे हैं, तो आप बस कॉलम या टेबल नाम के चारों ओर वर्गाकार कोष्ठक लपेट सकते हैं।

select [select]
from [table]

5

अपाचे ड्रिल में, बैककोट का उपयोग करें:

select `from` from table;

3

मैंने भी इस मुद्दे का सामना किया है। और इसके लिए समाधान इस तरह से [Column_Name] को क्वेरी में रखना है।

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

तो यह पूरी तरह से अच्छी तरह से काम करेगा।


3

हाय मैं Teradata सिस्टम पर काम करता हूं जो पूरी तरह से ANSI अनुरूप है। ऐसे कॉलम को नाम देने के लिए दोहरे उद्धरण चिह्नों का उपयोग करें।

Eg 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 में इस काम की पुष्टि करता हूं, धन्यवाद!
पॉल

1

आप अपना कॉलम नाम ब्रैकेट में रख सकते हैं जैसे:

Select  [from] from < ur_tablename>

या

एक टेम्परेरी टेबल में रखें फिर जैसे चाहें उपयोग करें।
उदाहरण:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

यहां मैं सिर्फ यह मानता हूं कि आपके_टैबलेन में केवल एक कॉलम (यानी से) है।


3
यह माना [from]जाता है कि एकमात्र स्तंभ है जो your_tablenameमिला है।
एंड्री एम

आप अस्थायी तालिका से क्या हासिल करते हैं? यह पूरी तरह से बेकार लगता है, सवाल के साथ कुछ भी नहीं करना है।
rjmunro

@rjmunro, नहीं, यह पूरी तरह से बेकार नहीं लगता है। मेरे पास एक मामला है जहां मैं SQL से एक सारणीबद्ध क्यूब क्वेरी करता हूं और यह '[कुल]' जैसे कॉलम के नाम देता है। अर्थात्, नाम में ही '[' और ']' 'है। आप ऐसे कॉलम को पुनः प्राप्त करने के लिए [[कुल]] और [कुल] का उपयोग नहीं कर सकते। सबसे आसान तरीका क्वेरी के परिणाम को एक अस्थायी तालिका में रखना है।
डार्लोव

@darlove क्या आप उद्धरण का उपयोग नहीं कर सकते "[Total]":? या शायद इससे बचने का एक तरीका है, कुछ ऐसा [\[Total\]]?
rjmunro

@rjmunro, इसे थोड़ा सा प्रयोग करने के बाद मैंने एक और तरीका खोजा है जिसके बारे में मुझे नहीं पता था: आप QUOTED_IDENTIFIER को ON पर सेट कर सकते हैं और फिर जिस चीज़ के बारे में आप बात कर रहे हैं, उसका उपयोग करें ", दोहरे उद्धरण"। रास्ता, लेकिन मैं पूरी तरह से अस्थायी तालिका विकल्प को नहीं
छोड़ेगा

1

मैं उसी अंक में चला गया जब एक कॉलम को अपडेट करने का प्रयास किया गया था जिसका नाम एक कीवर्ड था । ऊपर दिए गए समाधान ने मेरी मदद नहीं की। मैंने इसे इस तरह से तालिका के नाम को निर्दिष्ट करके हल किया:

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

1

निम्नलिखित पूरी तरह से काम करेगा:

SELECT DISTINCT table.from AS a FROM table

1

MySQL में, वैकल्पिक रूप से वापस उद्धरण (`) का उपयोग करने के लिए, आप कॉलम नामों को बदलने के लिए UI का उपयोग कर सकते हैं। तालिका> अलर्ट तालिका पर राइट क्लिक करें> कॉलम नाम संपादित करें जिसमें sql कीवर्ड> कमिट है।

select [from] from <table>

एक नोट के रूप में, उपरोक्त MySQL में काम नहीं करता है


1

यहां के जवाबों और मेरे अपने अनुभव को देखते हुए। केवल स्वीकार्य उत्तर, यदि आप पोर्टेबल होने की योजना बना रहे हैं, तो तालिका, स्तंभ, या अन्य नामों के लिए SQL कीवर्ड का उपयोग न करें।

ये सभी उत्तर विभिन्न डेटाबेस में काम करते हैं, लेकिन जाहिर तौर पर बहुत सारे एएनएसआई समाधान का समर्थन नहीं करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.