स्थिरांक से भरी कई पंक्तियों का चयन कैसे करें?


176

तालिका के संदर्भ के बिना स्थिरांक का चयन करना SQL कथन में पूरी तरह से कानूनी है:

SELECT 1, 2, 3

परिणाम सेट करता है कि उत्तरार्द्ध रिटर्न एकल पंक्ति है जिसमें मान शामिल हैं। मैं सोच रहा था कि क्या एक निरंतर अभिव्यक्ति का उपयोग करते हुए एक बार में कई पंक्तियों का चयन करने का एक तरीका है, कुछ इस प्रकार है:

SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))

मैं ऊपर की तरह कुछ चाहता हूँ जो काम करता है और 3 पंक्तियों और 3 कॉलम के साथ सेट परिणाम देता है।


1
आधिकारिक सिंटैक्स की तुलना में ऊपर आपकी कल्पना सिंटैक्स प्रीटियर (और INSERT INTO के साथ अधिक सुसंगत) है। मैं तो बस कह रहा हूं।
पीट एल्विन

2
@PeteAlvin कल्पना सिंटैक्स का पहले से ही Postgres में एक अर्थ है (एक ट्यूपल के साथ एक एकल पंक्ति चयनित है)।
किरिल ब्यूलगिन

2
नीचे दिया गया sql सर्वर उत्तर sql सर्वर के लिए अच्छी तरह से काम करता है, और इस सिंटैक्स से लगभग मेल खाता है। stackoverflow.com/a/53269562/2129481
बेनपेन

जवाबों:


203
SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9

2
मैं एसक्यूएल सर्वर के साथ इस का इस्तेमाल किया और यह काम किया, लेकिन मैं का इस्तेमाल किया था ASपहले पर उपनाम देने के लिएSELECT
स्लेज

धन्यवाद @ArtB, इस टिप्पणी से अन्य डेवलपर्स को सही वाक्यविन्यास प्राप्त करने में मदद मिल सकती है
डेवी

3
प्रत्येक Classic Reportसामग्री, FROM dualप्रत्येक SELECTमान के बाद और UNION ALLयदि मौजूद हो, तो पूरी तरह से स्थैतिक सामग्री के साथ तालिकाओं को बनाने के लिए Oracle APEX 5.1 में पूरी तरह से काम करता है ।
VELFR

118

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

SELECT  *
FROM    (
        VALUES
        (1, 2),
        (3, 4)
        ) AS q (col1, col2)

अन्य प्रणालियों में, बस उपयोग करें UNION ALL:

SELECT  1 AS col1, 2 AS col2
-- FROM    dual
-- uncomment the line above if in Oracle
UNION ALL
SELECT  3 AS col1, 3 AS col2
-- FROM    dual
-- uncomment the line above if in Oracle

में Oracle, SQL Serverऔर PostgreSQL, आप भी मनमाने ढंग से पंक्तियों की संख्या उत्पन्न कर सकते हैं (बाहरी चर के साथ)

SELECT  level
FROM    dual
CONNECT BY
        level <= :n

में Oracle,

WITH    q (l) AS
        (
        SELECT  1
        UNION ALL
        SELECT  l + 1
        FROM    q
        WHERE   l < @n
        )
SELECT  l
FROM    q
-- OPTION (MAXRECURSION 0)
-- uncomment line above if @n >= 100

में SQL Server,

SELECT  l
FROM    generate_series(1, $n) l

में है PostgreSQL


1
+1 मेरे (थोड़ा अलग) प्रश्न का उत्तर देने के लिए: SELECT 1ओरेकल ( SELECT 1 FROM Dualकाम) में कैसे करें ।
अनसमुंड एल्डह्यूसेट

13

VALUESPostgreSQL में मेरे लिए नंगे कमांड काम करता है:

VALUES (1,2,3), (4,5,6), (7,8,9)

1
टी-एसक्यूएल में एक बहु-पंक्ति सम्मिलित क्लाज के रूप में भी काम करता है। तालिका चर या अस्थायी तालिका में सम्मिलित करना पहले काम कर सकता था, लेकिन कई चरण।
20

12

ओरेकल में क्लॉज द्वारा कनेक्ट करने का प्रयास करें, कुछ इस तरह से

select level,level+1,level+2 from dual connect by level <=3;

क्लॉज द्वारा कनेक्ट पर अधिक जानकारी के लिए इस लिंक का अनुसरण करें: हटाए गए URL क्योंकि oraclebin साइट अब दुर्भावनापूर्ण है।


8

Microsoft SQL सर्वर या PostgreSQL के लिए आप इस सिंटैक्स को आज़माना चाह सकते हैं

SELECT constants FROM (VALUES ('foo@gmail.com'), ('bar@gmail.com'), ('baz@gmail.com')) AS MyTable(constants)

आप यहां SQL Fiddle भी देख सकते हैं: http://www.sqlfiddle.com/# -17 / 9eecb / 34703 /0


1
यह बिल्कुल SQL Server 2010 में काम करता है। कई कॉलम भी: सेलेक्ट कॉन्स्टेंट, ईमेल FROM (VALUES (1, 'foo @ gmail.com'), (2, 'bar @ gmail.com'), (3, 'baz / gmail) .com ')) AS MyTable (स्थिरांक, ईमेल)
BenPen

7

आकाशवाणी। इस पोस्ट पीएल / एसक्यूएल के लिए धन्यवाद - "सूची" का उपयोग करें जहां खंड में चर

मैंने आसानी से मैन्युअल रूप से इनपुट मानों के लिए अपना उदाहरण स्टेटमेंट एक साथ रखा (परीक्षकों द्वारा किसी एप्लिकेशन का परीक्षण करने में पुन: उपयोग किया जा रहा है):

WITH prods AS (
    SELECT column_value AS prods_code 
    FROM TABLE(
        sys.odcivarchar2list(
            'prod1', 
            'prod2'
        )
    )
)
SELECT * FROM prods

1
यह एक जीवन रक्षक था। एक बात ध्यान दें: यदि आपने बहुत अधिक मान त्रुटि में भाग लिया है, तो आप केवल बिना किसी खंड के एक UNION ALL कर सकते हैं।
स्क्रैपीडेव


4

यहां बताया गया है कि मैं एक साफ XML ट्रिक का उपयोग करके Oracle 10+ में स्थैतिक डेटा को कैसे पॉपुलेट करता हूं।

create table prop
(ID NUMBER,
 NAME varchar2(10),
 VAL varchar2(10),
 CREATED timestamp,
 CONSTRAINT PK_PROP PRIMARY KEY(ID)
);

merge into Prop p
using (
select 
  extractValue(value(r), '/R/ID') ID,
  extractValue(value(r), '/R/NAME') NAME,
  extractValue(value(r), '/R/VAL') VAL
from
(select xmltype('
<ROWSET>
   <R><ID>1</ID><NAME>key1</NAME><VAL>value1</VAL></R>
   <R><ID>2</ID><NAME>key2</NAME><VAL>value2</VAL></R>
   <R><ID>3</ID><NAME>key3</NAME><VAL>value3</VAL></R>
</ROWSET>
') xml from dual) input,
 table(xmlsequence(input.xml.extract('/ROWSET/R'))) r
) p_new
on (p.ID = p_new.ID)
when not matched then
insert
(ID, NAME, VAL, CREATED)
values
( p_new.ID, p_new.NAME, p_new.VAL, SYSTIMESTAMP );

मर्ज केवल उन पंक्तियों को सम्मिलित करता है जो मूल तालिका में गायब हैं, जो सुविधाजनक है यदि आप अपनी सम्मिलित स्क्रिप्ट को फिर से जोड़ना चाहते हैं।




0

यह कैसे DB2 की XML सुविधाओं का उपयोग कर यह करने के लिए है

SELECT *
FROM
XMLTABLE ('$doc/ROWSET/ROW' PASSING XMLPARSE ( DOCUMENT '
<ROWSET>
  <ROW>
    <A val="1" /> <B val="2" /> <C val="3" />
  </ROW>
  <ROW>
    <A val="4" /> <B val="5" /> <C val="6" />
  </ROW>
  <ROW>
    <A val="7" /> <B val="8" /> <C val="9" />
  </ROW>
</ROWSET>
') AS "doc"
   COLUMNS 
      "A" INT PATH 'A/@val',
      "B" INT PATH 'B/@val',
      "C" INT PATH 'C/@val'
) 
AS X
;

0

यह तरीका आपकी मदद कर सकता है

SELECT   TOP 3
         1 AS First, 
         2 AS Second, 
         3 AS Third 
FROM     Any_Table_In_Your_DataBase

Any_Table_In_Your_DataBase:कोई भी तालिका जिसमें 3 से अधिक रिकॉर्ड हैं, या किसी भी सिस्टम तालिका का उपयोग करते हैं। यहां हमें उस तालिका के डेटा से कोई सरोकार नहीं है।

आप Any_Table_In_Your_DataBaseतालिका से पहले, दूसरे और तीसरे स्तंभ के साथ एक कॉलम को निर्धारित करके परिणाम में बदलाव ला सकते हैं ।


आपको निर्दिष्ट करना चाहिए कि आप किस डेटाबेस का उपयोग करते हैं। 'TOP' कीवर्ड ओरेकल के साथ काम नहीं करता है।
हंस डेरगन

0

MySQL में, आप कर सकते हैं: values (1,2), (3, 4);

mysql> values (1,2), (3, 4);
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
2 rows in set (0.004 sec)

MySQL 8 के साथ, कॉलम नाम देना भी संभव है:

mysql> SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c, d);
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+

1
"मूल्यों (1,2), (3, 4)?" के लिए mysql का कौन सा संस्करण है?
रेने वोलेर

क्या वह दूसरा उदाहरण वास्तव में अभी भी कई पंक्तियों का चयन कर रहा है? इसके अलावा, उनमें से कोई भी PhpMyAdmin में प्रश्नों के रूप में चलने योग्य नहीं लगता है .. काश मैं आपको बता सकता कि मैं MySQL के किस संस्करण पर हूं, लेकिन MySQL संस्करण बहुत भ्रामक हैं, और मुझे यकीन है कि जब तक मैं इसे समझ नहीं लेता, तब तक मैं इस टिप्पणी को संपादित करने के लिए समय से बाहर
रहें

0
select (level - 1) * row_dif + 1 as a, (level - 1) * row_dif + 2 as b, (level - 1) * row_dif + 3 as c
    from dual 
    connect by level <= number_of_rows;

ऐसा कुछ

select (level - 1) * 3 + 1 as a, (level - 1) * 3 + 2 as b, (level - 1) * 3 + 3 as c
    from dual 
    connect by level <= 3;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.