कुछ नहीं से चयन करें?


90

क्या ऐसा बयान देना संभव है

SELECT "Hello world"
WHERE 1 = 1

SQL में?

मुख्य बात जो मैं जानना चाहता हूं, क्या मैं कुछ भी नहीं से चयन कर सकता हूं, अर्थात FROM क्लॉज नहीं है।


3
@ राफेल बेलियार्ड पर आपकी टिप्पणी को देखते हुए, आप यह पूछना बेहतर समझ सकते हैं कि आप वास्तव में क्या करना चाहते हैं। क्या आप कुछ स्ट्रिंग वापस करना चाहते हैं यदि उदाहरण के लिए दिए गए तालिका में मान मौजूद हैं?
जिम एल।

हां, यह वास्तव में वही है जो मैं चाहता था। मुझे पता है कि मैं यह कर सकता, मैं और अधिक सोच अगर मैं एक जरूरी था FROM NULLके बीच SELECTऔर WHERE। अस्पष्ट रूप से अधिकांशतः अस्पष्ट क्योंकि यह होमवर्क है और मैं नहीं चाहता था कि कोई आये और मुझे उत्तर बताये कि अगर मेरी आंत की भावना गलत थी।
ऋत्विक बोस

जवाबों:


140

यह विक्रेताओं के बीच सुसंगत नहीं है - ओरेकल, MySQL और DB2 समर्थन दोहरी:

SELECT 'Hello world'
  FROM DUAL

... जबकि SQL सर्वर, PostgreSQL और SQLite की आवश्यकता नहीं है FROM DUAL:

SELECT 'Hello world'

MySQL दोनों तरीकों का समर्थन करता है।


2
मुझे हमेशा आश्चर्य होता है। प्रेत तालिका के लिए दोहरे शब्द का चुनाव क्यों?
एलेक्स ब्लेकमोर

5
@ एलेक्स: "मूल DUAL तालिका में दो पंक्तियाँ थीं (इसलिए इसका नाम), लेकिन बाद में इसमें केवल एक पंक्ति थी।"
विद्रोही

7
DB2 दोहरे पर 'sysibm.sysdummy1' कहा जाता है
डेन्यूबियन नाविक

1
Postgresql पर, यह एक डमी टेबल बनाने के लिए संभव है, DUALजो एक प्रेत जैसी तालिका से प्रश्न करता है।
Stephan

1
@AlexBlakemore "मैंने Oracle डेटा डिक्शनरी में एक अंतर्निहित वस्तु के रूप में DUAL तालिका बनाई है। इसे कभी भी स्वयं देखा नहीं गया था, लेकिन इसके बजाय एक ऐसे दृश्य के अंदर उपयोग किया गया था, जिसके क्वेर होने की उम्मीद थी। विचार यह था कि आप एक JOIN कर सकते हैं। DUAL तालिका और अपनी तालिका में हर एक पंक्ति के लिए परिणाम में दो पंक्तियाँ बनाएँ। फिर, GROUP BY का उपयोग करके, परिणामी जोड़ को DATA सीमा और INDEX सीमा (ओं) के लिए भंडारण की मात्रा दिखाने के लिए संक्षेप में प्रस्तुत किया जा सकता है। DUAL नाम, केवल एक पंक्तियों की एक जोड़ी बनाने की प्रक्रिया के लिए उपयुक्त प्रतीत होता है "( en.wikipedia.org/wiki/DUAL_table )
Ok


14

इसे इस्तेमाल करे।

एक:

SELECT *  FROM (VALUES ('Hello world')) t1 (col1) WHERE 1 = 1

मल्टी:

SELECT *  FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1

यहाँ और अधिक विवरण: http://modern-sql.com/use-case/select-without-from


1
केवल एएनएसआई एसक्यूएल आज्ञाकारी जवाब! (बिना dbms निर्दिष्ट प्रश्न के साथ।)
jarlh

का उद्देश्य क्या है WHERE 1 = 1? PostgreSQL पर इसके बिना काम करता है। या यह एक और DMBS की चिंता है?
फ्रेंकी ड्रेक

केवल SELECT * FROM (VALUES ("Hello world")) t1 (col1)अभी भी ठीक। Whereबस इस सवाल का जवाब है।
चूंग्तव

@chuongtv आप कई पंक्तियों का चयन कैसे करते हैं?
हेक्टर

@ हेक्टर एसक्यूएल के स्ट्रक्चर इंसर्ट का पालन करें। इस तरहSELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
chuongtv

8

यहां https://blog.jooq.org/tag/dual-table// से दोहरे के डेटाबेस समर्थन की सबसे पूरी सूची है :

कई अन्य RDBMS में, डमी टेबल की कोई आवश्यकता नहीं है, क्योंकि आप इन जैसे बयान जारी कर सकते हैं:

SELECT 1;
SELECT 1 + 1;
SELECT SQRT(2);

ये आरडीबीएमएस हैं, जहां ऊपर आम तौर पर संभव है:

  • एच 2
  • माई एसक्यूएल
  • Ingres
  • postgres
  • SQLite
  • एस क्यू एल सर्वर
  • Sybase ASE

अन्य RDBMS में, Oracle की तरह डमी टेबल की आवश्यकता होती है। इसलिए, आपको इन चीजों को लिखना होगा:

SELECT 1       FROM DUAL;
SELECT 1 + 1   FROM DUAL;
SELECT SQRT(2) FROM DUAL;

ये RDBMS और उनके संबंधित डमी टेबल हैं:

  • DB2: SYSIBM.DUAL
  • डर्बी: SYSIBM.SYSDUMMY1
  • H2: वैकल्पिक रूप से DUAL का समर्थन करता है
  • HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
  • MySQL: वैकल्पिक रूप से DUAL का समर्थन करता है
  • ओरेकल: दोहरी
  • Sybase SQL कहीं भी: SYS.DUMMY

Ingres का कोई DUAL नहीं है, लेकिन वास्तव में इसकी आवश्यकता होगी, क्योंकि Ingres में आपके पास WHERE, GROUP BY या HROMING क्लाज बिना FROM क्लॉज के नहीं हो सकते।


6

SQL सर्वर प्रकार में:

Select 'Your Text'

FROMया WHEREखंड की कोई आवश्यकता नहीं है ।


5

आप ऐसा कर सकते हैं। मैं StackExchange Data Explorer क्वेरी में निम्न पंक्तियों का उपयोग कर रहा हूँ :

SELECT
(SELECT COUNT(*) FROM VotesOnPosts WHERE VoteTypeName = 'UpMod' AND UserId = @UserID AND PostTypeId = 2) AS TotalUpVotes,
(SELECT COUNT(*) FROM Answers WHERE UserId = @UserID) AS TotalAnswers

डेटा एक्सचेंज Transact-SQL (SQL सर्वर मालिकाना एक्सटेंशन SQL के लिए) का उपयोग करता है।

आप एक क्वेरी चलाकर इसे स्वयं आज़मा सकते हैं:

SELECT 'Hello world'

SQL सर्वर पर आधारित डेटा एक्सचेंज Azure है।
OMG पोंजी

2

मुझे लगता है कि यह संभव नहीं है। सैद्धांतिक रूप से: चयन दो तरह की चीजें करता है:

  • संकीर्ण / विस्तृत (सेट-थ्योरी);

  • परिणाम मानचित्रण।

पहले वाले को क्षैतिज-ह्रास के रूप में देखा जा सकता है, जहां विराम के विपरीत एक ऊर्ध्वाधर ह्रास के रूप में देखा जा सकता है। दूसरी ओर, एक जुड़ाव क्षैतिज रूप से सेट को बढ़ा सकता है जहां एक संघ सेट को लंबवत रूप से बढ़ा सकता है।

               augmentation          diminishing
horizontal     join/select              select   
vertical          union            where/inner-join

दूसरा एक मैपिंग है। एक मैपिंग, एक कनवर्टर अधिक है। SQL में यह कुछ फ़ील्ड लेता है और शून्य या अधिक फ़ील्ड लौटाता है। चयन में, आप कुछ कुल कार्यों जैसे, सम, एवीजी आदि का उपयोग कर सकते हैं या सभी स्तंभों को एक स्ट्रिंग में परिवर्तित कर सकते हैं। C # linq में, हम कहते हैं कि एक सेलेक्ट T के ऑब्जेक्ट को स्वीकार करता है और टाइप U का ऑब्जेक्ट देता है।

मुझे लगता है कि भ्रम इस तथ्य से आता है कि आप क्या कर सकते हैं select 'howdy' from <table_name>:। यह सुविधा मानचित्रण, चयन का कनवर्टर भाग है। आप कुछ नहीं छाप रहे हैं, लेकिन परिवर्तित! आपके उदाहरण में:

SELECT "
WHERE 1 = 1

आप कुछ भी नहीं / शून्य में परिवर्तित कर रहे हैं "Hello world" और आप कुछ भी नहीं / कोई तालिका के सेट को एक पंक्ति में संकीर्ण करते हैं, जो, बिल्कुल भी कोई मतलब नहीं है।

आप देख सकते हैं कि, यदि आप स्तंभों की संख्या में कमी नहीं करते हैं, तो "Hello world"तालिका में प्रत्येक उपलब्ध पंक्ति के लिए मुद्रित किया जाता है। मुझे उम्मीद है, आप समझ गए होंगे कि अब तक क्यों। आपका चयन उपलब्ध कॉलम से कुछ नहीं लेता है और पाठ के साथ एक कॉलम बनाता है:"Hello world" :।

तो, मेरा जवाब नहीं है। आप केवल खंड से बाहर नहीं छोड़ सकते क्योंकि चयन को हमेशा प्रदर्शन करने के लिए टेबल-कॉलम की आवश्यकता होती है।


2

मानक SQL में, नहीं। एक WHEREखंड का तात्पर्य एक टेबल एक्सप्रेशन से है।

SQL-92 कल्पना से:

7.6 "जहां खंड"

समारोह

"खंड से" पूर्ववर्ती के परिणाम के लिए "खोज स्थिति" के आवेदन द्वारा प्राप्त तालिका निर्दिष्ट करें।

के बदले में:

7.4 "खंड से"

समारोह

एक या अधिक नामित तालिकाओं से प्राप्त तालिका निर्दिष्ट करें।

इसे करने का एक मानक तरीका (अर्थात किसी भी SQL उत्पाद पर काम करना चाहिए):

SELECT DISTINCT 'Hello world' AS new_value
  FROM AnyTableWithOneOrMoreRows
 WHERE 1 = 1;

... यह मानते हुए कि आप WHEREक्लॉज़ को कुछ और सार्थक करना चाहते हैं, अन्यथा इसे छोड़ दिया जा सकता है।


त्रुटि: कॉलम "हेल्लो वर्ल्ड" my_table में मौजूद नहीं है Query विफल पोस्टग्रेक्सेल ने कहा: कॉलम "हेल्लो वर्ल्ड" my_table में मौजूद नहीं है
Pål Brattberg

@ PålBrattberg: एकल उद्धरण होना चाहिए, अब तय हो गया है।
रात 11:27

क्या यह मायने रखता है कि प्रसंस्करण समय के संदर्भ में किस तालिका का उपयोग किया जाता है? या तथ्य यह है कि SELECT किसी भी कॉलम का संदर्भ नहीं देता है, वास्तविक तालिका को अप्रासंगिक बनाता है?
एलन गाउन

@ एलेनगॉल्ड: यह 'वेंडर आश्रित' होगा, लेकिन इसमें स्पष्ट शॉर्ट सर्किट होते हैं, जिनका फायदा उठाया जा सकता है। उदाहरण के लिए, एक ऐसा मामला है, जिसमें ऑप्टिमाइज़र SELECTक्लॉज को शामिल करता है, जिसमें केवल स्थिरांक होता है और AnyTableWithOneOrMoreRowsयह एक संग्रहित तालिका होती है, इसलिए तालिका को सत्यापित करने के लिए केवल आंकड़ों का उपयोग करता है शून्य पंक्तियाँ।
onedaywhen

2

एक और संभावना है - स्टैंडअलोन VALUES():

VALUES ('Hello World');

आउटपुट:

column1
Hello World

यह उपयोगी है जब आपको कॉम्पैक्ट तरीके से कई मान निर्दिष्ट करने की आवश्यकता होती है:

VALUES (1, 'a'), (2, 'b'), (3, 'c');

आउटपुट:

column1     column2
      1     a
      2     b
      3     c

DBFiddle डेमो

यह सिंटैक्स SQLite / PostgreSQL / DB LUW / MariaDB 10.3 द्वारा समर्थित है।


2

ClickHouse के लिए, कुछ भी नहीं है system.one

SELECT 1 FROM system.one

1

Firebird में, आप यह कर सकते हैं:

select "Hello world" from RDB$DATABASE;

RDB $ DATABASE एक विशेष तालिका है जिसमें हमेशा एक पंक्ति होती है।


0

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन आपके प्रश्न के लिए सबसे अच्छा समाधान एक डमी सबक्वेरी का उपयोग करना है:

SELECT 'Hello World'
FROM (SELECT name='Nothing') n
WHERE 1=1

इस तरह से आप WHERE और कोई भी क्लॉज (जैसे जॉइन या अप्लाई इत्यादि) चुन सकते हैं, क्योंकि स्टेटमेंट के बाद डमी सबक्वेरी परिणाम बदलने के बिना FROM क्लॉज का उपयोग करने के लिए बाध्य करता है।


1
आपके पास अभी भी आपके अधीनस्थ में एक के SELECTबिना है FROM, इसलिए यह अभी भी ओरेकल में विफल रहेगा, आदि
Pere

Oracle में और भी सरल है क्योंकि आप SELECT 'Hello' FROM dual WHERE 1=1उपकुंजी को सिर्फ और सिर्फ छोड़ सकते हैं ।
डोमिंगोआर

ओपी ने पूछा कि क्या SELECTएक FROMखंड के बिना एक बयान (अर्थात्, ए ) होना संभव था । क्या आपने प्रश्न नहीं पढ़ा है?
पेरे

मैंने प्रश्न पढ़ा लेकिन जब तक आप SQL में पूरी तरह अनुभवहीन नहीं होते (या अन्य उत्तर नहीं पढ़ते) आपको पता है कि आपके WHEREबिना नहीं हो सकता FROM। यह देखते हुए, मैंने ओपी प्रश्न के पहले कथन का उत्तर दिया।
डोमिंगो 11

खैर, मेरे पास SQL, कम्प्यूटिंग डिग्री में 15 से अधिक वर्षों का अनुभव है और याद नहीं है कि क्या अब एक WHEREमानक SQL था। मैंने अन्य उत्तर भी पढ़े। वैसे: उचित बात यह है कि आपके पास एक SELECTबिना नहीं हो सकता हैFROM , " WHEREबिना FROM" (?) के नहीं। आपकी क्वेरी कहां काम करती है, @DomingoR? यह अभी भी एक है SELECTएक के बिना FROMइस प्रकार उन डीबीएमएस है कि एक के बिना प्रश्नों होने की अनुमति नहीं है पर असफल रहने (सबक्वेरी में), FROMऔर केवल उन जो मानक SQL से भटक और एक नहीं होने की अनुमति देते हैं पर काम कर FROMमें SELECT। तो आपका जवाब कुछ नहीं के लिए कार्य करता है।
पेरे

0

मैं फायरबर्ड का उपयोग कर रहा हूं सबसे पहले, "NoTable" नामक एक स्तंभ तालिका बनाएं

CREATE TABLE NOTABLE 
(
  NOCOLUMN              INTEGER
);
INSERT INTO NOTABLE VALUES (0); -- You can put any value

अब आप यह लिख सकते हैं

select 'hello world' as name

उल्लेखनीय है

आप जो भी कॉलम दिखाना चाहते हैं उसे जोड़ सकते हैं


0

DB2 के लिए:

`VALUES('Hello world')`

आप कई "पंक्तियाँ" भी कर सकते हैं:

`VALUES('Hello world'),('Goodbye world');`

तुम भी उन्हें जब तक प्रकार के मैच में शामिल हो सकते हैं:

VALUES(1,'Hello world')
UNION ALL
VALUES(2,'Goodbye world');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.