2009-06-24 12 views
25

मैं पैरामीटर के साथ एक संग्रहीत प्रक्रिया बनाना चाहता हूं जो इंगित करता है कि कौन से फ़ील्ड का चयन किया जाना चाहिए।एसक्यूएल सशर्त चयन

उदा। मैं दो पैरामीटर "selectField1" और "selectField2" को प्रत्येक को बूल के रूप में पास करना चाहता हूं।

तो मैं जैसे

SELECT 

if (selectField1 = true) Field1 ELSE do not select Field1 

if (selectField2 = true) Field2 ELSE do not select Field2 

FROM Table 

धन्यवाद कार्ल

उत्तर

9

लगता है जैसे वे केवल स्वीकृत फ़ील्ड लौटने की क्षमता चाहते हैं, जिसका अर्थ है कि लौटाए गए फ़ील्ड की संख्या भी गतिशील होनी चाहिए। यह 2 चर के साथ काम करेगा। उससे ज्यादा कुछ भ्रमित हो जाएगा।

IF (selectField1 = true AND selectField2 = true) 
BEGIN 
    SELECT Field1, Field2 
    FROM Table 
END 
ELSE IF (selectField1 = true) 
BEGIN 
    SELECT Field1 
    FROM Table 
END 
ELSE IF (selectField2 = true) 
BEGIN 
    SELECT Field2 
    FROM Table 
END 

गतिशील एसक्यूएल गुणकों के साथ मदद मिलेगी। यह उदाहरण मानते हैं कि कम से कम 1 कॉलम सत्य है।

DECLARE @sql varchar(MAX) 
SET @sql = 'SELECT ' 
IF (selectField1 = true) 
BEGIN 
    SET @sql = @sql + 'Field1, ' 
END 
IF (selectField2 = true) 
BEGIN 
    SET @sql = @sql + 'Field2, ' 
END 
... 
-- DROP ', ' 
@sql = SUBSTRING(@sql, 1, LEN(@sql)-2) 

SET @sql = @sql + ' FROM Table' 

EXEC(@sql) 
+0

मैं जो करना चाहता हूं वह वास्तव में 1 या दो फ़ील्ड चुनने के बजाय बहुत अधिक जटिल है। मैं क्षेत्र के एक झुंड है कि मैं जैसे, गतिशील रूप से चयन करने में सक्षम है, साथ ही कुछ क्षेत्रों पर एक कहां कर रहने की जरूरत है: @ whereField1 = 1 @ whereField2 = 1 @ whereField3 = 0 आदि और फिर फ़ील्ड 1 पर केवल एक करें जहां @ whereField1 = 1 आदि ऐसा लगता है कि आपका दूसरा उदाहरण वास्तव में ऐसा करने का एकमात्र तरीका हो सकता है। हालांकि वर्चर (MAX) कितने अक्षर हैं? – Karl

+0

एसक्यूएल 2005 8000 वर्णों तक स्टोर कर सकता है। SQL2005 में –

+0

@ जस्टिन वर्कर (अधिकतम) 8000 वर्णों तक सीमित नहीं है। वर्चर (अधिकतम) को SQL 2005 में वर्चर के लिए उपलब्ध कार्यों के समर्थन के साथ टेक्स्ट डेटा प्रकार के प्रतिस्थापन के कुछ प्रकार के रूप में पेश किया गया था। – kristof

48

SQL में कुछ चाहते हैं, तो आप इसे इस तरह से कार्य करें:

SELECT CASE WHEN @selectField1 = 1 THEN Field1 ELSE NULL END, 
     CASE WHEN @selectField2 = 1 THEN Field2 ELSE NULL END 
FROM Table 

संबंधपरक मॉडल गतिशील क्षेत्र गिनती संकेत नहीं करता है।

इसके बजाय, यदि आप किसी फ़ील्ड मान में रुचि नहीं रखते हैं, तो आप इसके बजाय NULL का चयन करें और इसे क्लाइंट पर पार्स करें।

+0

में

उदाहरण यह अधिक कुशल और स्वच्छ है, लेकिन क्या हुआ अगर शून्य अपने वैकल्पिक क्षेत्रों में से एक के लिए एक वैध संभव मूल्य है? क्या आप संभवतः फील्ड नामों का विश्लेषण करेंगे? – PapillonUK

15

आप CASE statement हैं:

SELECT 
    CASE 
    WHEN @SelectField1 = 1 THEN Field1 
    WHEN @SelectField2 = 1 THEN Field2 
    ELSE NULL 
    END AS NewField 
FROM Table 

संपादित करें: मेरा उदाहरण एक क्षेत्र में दो क्षेत्रों के संयोजन, आपूर्ति मापदंडों पर निर्भर करता है के लिए है। यह एक-या-न तो समाधान (दोनों नहीं) है। यदि आप आउटपुट में दोनों फ़ील्ड रखने की संभावना चाहते हैं, तो क्वास्नोई के समाधान का उपयोग करें।

MY_FIELD= 
     case 
      when (selectField1 = 1) then Field1 
           else Field2   
     end, 
चयन

हालांकि में

, वाई कर आप सिर्फ इतना है कि स्तंभ नहीं दिखा नहीं:

+0

मैं अक्सर ऐसा करता हूं, हालांकि एसक्यूएल को बयानों को कैश करने में परेशानी है लेकिन आप वास्तव में इसके आसपास नहीं जा सकते हैं। – Kezzer

+0

यदि कॉलम अलग-अलग प्रकार के हैं तो यह असफल हो सकता है उदा। int vs char – kristof

0

यह

IF (selectField1 = true) 
SELECT Field1 FROM Table 
ELSE 
SELECT Field2 FROM Table 
0

क्या आप चाहते करने का एक तरीका है छद्म आपके कार्यक्रम में?

2
@selectField1 AS bit 
@selectField2 AS bit 

SELECT 
CASE 
    WHEN @selectField1 THEN Field1 
    WHEN @selectField2 THEN Field2 
    ELSE someDefaultField 
END 
FROM Table 

यह आपके लिए क्या देख रहे हैं?

-1

noob तरीका यह है:

SELECT field1, field2 FROM table WHERE field1 = TRUE OR field2 = TRUE 

आप केवल एक है, तो-और कुछ कर रही प्रोग्रामिंग भाषा में ठीक से इस जानकारी का प्रबंधन कर सकते हैं। एएसपी/जावास्क्रिप्ट

// Code to retrieve the ADODB.Recordset 
if (rs("field1")) { 
    do_the_stuff_a(); 
} 
if (rs("field2")) { 
    do_the_stuff_b(); 
} 
rs.MoveNext(); 
संबंधित मुद्दे