मैं SQL सर्वर में मूल्यों की सूची से कैसे चयन कर सकता हूं


216

मेरे पास बहुत सरल समस्या है जिसे मैं हल नहीं कर सकता। मुझे ऐसा कुछ करने की आवश्यकता है:

select distinct * from (1, 1, 1, 2, 5, 1, 6).

कोई भी मदद कर सकता है ??

संपादित करें

डेटा हमारे ग्राहकों में से एक से एक पाठ फ़ाइल के रूप में आता है। यह पूरी तरह से विकृत है (यह पाठ की एक एकल, बहुत लंबी पंक्ति है), लेकिन एक्सेल में ऐसा करना संभव हो सकता है। लेकिन यह मेरे लिए व्यावहारिक नहीं है, क्योंकि मुझे अपनी sql क्वेरी में इन मूल्यों का उपयोग करने की आवश्यकता होगी। हर बार ऐसा करना सुविधाजनक नहीं है, जब मुझे क्वेरी चलाने की आवश्यकता हो।


क्या आप एक से अधिक तालिकाओं का चयन करना चाहते हैं या किसी एक तालिका से चयन करना चाहते हैं, लेकिन विशिष्ट मानों का चयन करना चाहते हैं? विशिष्ट आईडी की अकेले की तरह कुछ चीजें
अनिरुद्ध गोयल

वह नहीं जो आप पूछते हैं, लेकिन आप इसे दूसरी भाषा में कर सकते हैं। PowerShell में उदाहरण के लिए, आप $d = (1, 1, 1, 2, 5, 1, 6) | sort -Uniqueकिसी सरणी में अलग-अलग मान प्राप्त करने के लिए कर सकते हैं $d। फ़ाइल-टू-फ़ाइल टूल का विस्तार करना आसान है।
जेपी स्टिग नीलसन

क्या उन मूल्यों की एक अलग सूची प्राप्त करने के लिए, या SQL में मूल्यों की सूची प्राप्त करने के लिए यहां महत्वपूर्ण बात है? जैसा कि @JeppeStigNielsen का कहना है, एक पाठ सूची से अलग मान प्राप्त करने के अन्य तरीके हैं जिसमें SQL शामिल नहीं है। मैं यहाँ एक अन्य स्क्रिप्ट को संदर्भित करने वाली SQL स्क्रिप्ट में मानों की एक सूची प्राप्त करने की तलाश में आया था।
रिक्की

जवाबों:


81

कॉमा सीमांकित पाठ की लंबी सूची के अलग-अलग मूल्यों को प्राप्त करने का सबसे सरल तरीका यह होगा कि अलग-अलग मूल्यों को प्राप्त करने के लिए UNION के साथ एक प्रतिस्थापन का उपयोग करें ।

SELECT 1
UNION SELECT 1
UNION SELECT 1
UNION SELECT 2
UNION SELECT 5
UNION SELECT 1
UNION SELECT 6

कॉमा सीमांकित पाठ की अपनी लंबी लाइन के लिए लागू

  • हर अल्पविराम को ढूंढें और बदलें UNION SELECT
  • SELECTबयान के सामने एक जोड़ें

अब आपके पास एक कामकाजी क्वेरी होनी चाहिए


3
नहीं, नहीं, मेरे पास कई सैकड़ों मूल्यों की सूची है, मैन्युअल रूप से यह यातना होगी
Eedoh

वह सूची कहाँ से आती है? यह आसान तरीका हो सकता है कि एक्सेल में उस सूची को कॉपी / पेस्ट करें और एक साधारण क्रॉसस्टैब का उपयोग करके वहां के विभिन्न मूल्यों को निकालें।
लेवेन कीर्सेमेकर्स

btw, खोजने और बदलने के लिए भी आप एक लंबा रास्ता तय कर सकते हैं। प्रत्येक अल्पविराम को संघ चयन के साथ बदलें , सामने एक चयन जोड़ें और आपके पास एक कामकाजी क्वेरी होनी चाहिए जो मैंने दिखाया था।
लेवेन केर्सेमेकर्स

1
चुनिंदा संघ के साथ अल्पविराम की जगह यह सामान एक आकर्षण की तरह काम करता है धन्यवाद :)
Eedoh

5
प्रदर्शन कारणों के लिए, मैं आपके बाहरी चयन में डिस्ट्रिक्ट का उपयोग करके, उसके बाद यूनियन-ऑल की सिफारिश करूंगा।
माइकेटीवी

427

केवल SQL सर्वर 2008 पर उपलब्ध है और इस रूप में पंक्ति-निर्माता है:
आप उपयोग कर सकते हैं

SELECT DISTINCT * FROM (VALUES (1), (1), (1), (2), (5), (1), (6)) AS X(a)

कई लोगों ने उनके बारे में लिखा:


66
साइड-नोट: Xतालिका नाम के aलिए उपनाम है और स्तंभ नाम के लिए उपनाम है;)।
shA.t

11
वर्तमान में चयनित एक की तुलना में यह अधिक सही उत्तर है
TabsNotSpaces

1
यह सबसे सामान्य तरीका है, मुझे अनावश्यक (ARRAY []) द्वारा खराब कर दिया गया था pgsqlऔर अब पंक्ति के रिकॉर्ड के रूप में मामूली मूल्यों को स्वीकार करने के लिए FROM को धमाकेदार बनाने के लिए sqlserverऔर यहाँ यह है। जानकर खुशी हुई।
बेन

1
कॉलम और टेबल उपनाम के कारण बेहतर उत्तर
अल्फ्रेडो ए।

79

सामान्य रूप में :

SELECT 
  DISTINCT 
      FieldName1, FieldName2, ..., FieldNameN
FROM
  (
    Values
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN )
  ) AS TempTableName ( FieldName1, FieldName2, ..., FieldNameN )

आपके मामले में :

Select 
  distinct
  TempTableName.Field1 
From 
  (
  VALUES
    (1), 
    (1), 
    (1), 
    (2), 
    (5), 
    (1), 
    (6)
  ) AS TempTableName (Field1)

1
मुझे पता है कि "चयन *" को बुरा रूप माना जाता है, लेकिन क्या इस मामले में चयन * का उपयोग नहीं करने का कोई कारण है? क्योंकि FieldName1, FieldName2, ..., FieldNameN का दोहराव अतिक्रमण है।
Pxtl

@Pxtl "Select *" का उपयोग नहीं करने का कोई कारण नहीं है। मैंने उन फ़ील्ड के नामों को अधिक स्पष्ट होने के लिए फिर से लिखा है। साथ ही, आपको "डिस्टिक्ट" कीवर्ड की आवश्यकता नहीं है।
अरदलन शहघोली

43

क्या आपने निम्नलिखित सिंटैक्स का उपयोग करने की कोशिश की है?

select * from (values (1), (2), (3), (4), (5)) numbers(number)

5
एक अनाम उपयोगकर्ता ने कोड को संपादित करने का सुझाव दिया:SELECT DISTINCT table_name.column_name FROM (VALUES (1), (2), (3)) AS table_name(column_name)
Vogel612

19

यदि आप किसी एकल तालिका से केवल कुछ मानों का चयन करना चाहते हैं, तो आप यह कोशिश कर सकते हैं

select distinct(*) from table_name where table_field in (1,1,2,3,4,5)

उदाहरण के लिए:

select first_name,phone_number from telephone_list where district id in (1,2,5,7,8,9)

यदि आप कई तालिकाओं से चयन करना चाहते हैं तो आपको अवश्य जाना चाहिए UNION

यदि आप केवल 1, 1, 1, 2, 5, 1, 6 का मान चुनना चाहते हैं तो आपको यह करना चाहिए

select 1 
union select 1 
union select 1 
union select 2 
union select 5 
union select 1 
union select 6

1
मुझे किसी तालिका से चयन करने की आवश्यकता नहीं है, लेकिन मूल्यों की इस सूची से (कोष्ठक में)। यह मुख्य समस्या है (अल्पविराम से अलग किए गए मानों का चयन, सारणी से नहीं)
ईदो

उस मामले में, जैसे हमारे पास Oracle में DUAL तालिका है, आप उसी का उपयोग कर सकते हैं। लेकिन चूंकि कोई डीयूएल नहीं है तो आपको संघ के रास्ते पर जाना होगा। आप एक और तरीका आजमा सकते हैं, जैसा कि आपने उल्लेख किया है कि आपके पास अल्पविराम द्वारा अलग किए गए मान हैं, तो आप उन्हें किसी तालिका में सम्मिलित क्यों नहीं करते हैं और फिर कई वर्गीय यूनियनों का उपयोग करने के बजाय एक साफ वर्गीय चयन क्वेरी का उपयोग करें।
अनिरुद्ध गोयल

14

PostgreSQL आपको ऐसा करने के 2 तरीके देता है:

SELECT DISTINCT * FROM (VALUES('a'),('b'),('a'),('v')) AS tbl(col1)

या

SELECT DISTINCT * FROM (select unnest(array['a','b', 'a','v'])) AS tbl(col1)

ऐरे एप्रोच का उपयोग कर आप भी कुछ ऐसा कर सकते हैं:

SELECT DISTINCT * FROM (select unnest(string_to_array('a;b;c;d;e;f;a;b;d', ';'))) AS tbl(col1)

11
हालाँकि यह प्रश्न MSSQL को निर्दिष्ट करता है ...:)
रोकें

@halfer यहां दिए गए पहले उत्तर ने मेरे लिए काम किया, जबकि MSSQL 2016 ने अन्य उत्तर नहीं दिए। साल बाद
डस्टीट्रैश

9

यह SQL Server 2005 पर काम करता है और यदि अधिकतम संख्या है:

SELECT * 
FROM
  (SELECT ROW_NUMBER() OVER(ORDER BY a.id) NUMBER
  FROM syscomments a
  CROSS JOIN syscomments b) c
WHERE c.NUMBER IN (1,4,6,7,9)

2
+1 नीयन लेकिन यह सीमित मात्रा में पंक्तियों की मात्रा है जो क्रॉस क्रॉस में स्वयं के साथ जुड़ती है। मेरे मामले में 294849 पर। (और आप अलग-अलग भूल गए।)
लेवेन कीर्सेमेकर्स

आप एक बार फिर शामिल हो सकते हैं, लेकिन कॉमा की जगह बहुत तेज़ समाधान है।
लुकलैड

हाँ, यह तरीका अच्छा भी है, लेकिन मैं लेवेन के समाधान को पसंद करता हूं, क्योंकि यह सरलता है।
ईदो

3

मुझे पता है कि यह एक बहुत पुराना धागा है, लेकिन मैं कुछ इसी तरह की खोज कर रहा था और इसके साथ आया।

यह देखते हुए कि आपके पास अल्पविराम से पृथक स्ट्रिंग है, आप उपयोग कर सकते हैं string_split

select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')

यह वापस आना चाहिए

1
2
5
6

स्ट्रिंग विभाजन दो मापदंडों, स्ट्रिंग इनपुट और विभाजक चरित्र लेता है।

आप एक वैकल्पिक जोड़ सकते हैं जहां valueकॉलम नाम के रूप में बयान का उपयोग किया जा सकता है

select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')
where value > 1

पैदा करता है

2
5
6

ऐसा लगता है कि MSSQL 2016 या बाद की आवश्यकता है: docs.microsoft.com/en-us/sql/t-sql/functions/…
जोनाथन

1
@Sam हाँ, यह SQL सर्वर है, मूल प्रश्न के टैग के अनुसार
नैपकिनबेक

1
@ जोनाथन हां, प्रश्न की आयु को देखते हुए, इसने मूल पोस्टर की मदद नहीं की होगी, लेकिन मुझे लगा कि कोई व्यक्ति इस पर ठोकर खा सकता है, जैसा कि मैंने किया था, और इसे मददगार पाया।
नैपकिनबेक

2

यदि आपको एक सरणी की आवश्यकता है, तो सरणी कॉलम को अल्पविराम से अलग करें:

SELECT * FROM (VALUES('WOMENS'),('MENS'),('CHILDRENS')) as X([Attribute])
,(VALUES(742),(318)) AS z([StoreID])

0

एक और तरीका है कि आप इस तरह से एक क्वेरी का उपयोग कर सकते हैं:

SELECT DISTINCT
    LTRIM(m.n.value('.[1]','varchar(8000)')) as columnName
FROM 
    (SELECT CAST('<XMLRoot><RowData>' + REPLACE(t.val,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
     FROM (SELECT '1, 1, 1, 2, 5, 1, 6') AS t(val)
    ) dt
  CROSS APPLY 
    x.nodes('/XMLRoot/RowData') m(n);


-2

मेरे लिए काम करने वाली एक तकनीक एक तालिका को क्वेरी करने के लिए है जिसे आप जानते हैं कि इसमें बड़ी संख्या में रिकॉर्ड हैं, जिसमें आपके परिणाम में सिर्फ Row_Number फ़ील्ड शामिल है

Select Top 10000 Row_Number() OVER (Order by fieldintable) As 'recnum' From largetable

1 से 10000 तक 10000 रिकॉर्ड का परिणाम सेट लौटाएगा, वांछित परिणाम देने के लिए इसे किसी अन्य क्वेरी के भीतर उपयोग करें


-4

SQL Inफ़ंक्शन का उपयोग करें

कुछ इस तरह:

SELECT * FROM mytable WHERE:
"VALUE" In (1,2,3,7,90,500)

आर्कजीआईएस में उपचार करता है


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