एकाधिक `या` भाव से बचना


13

मेरे पास निम्नलिखित ओरेकल एसक्यूएल और इसके काम हैं और सभी हैं लेकिन यह सभी के साथ काफी बदसूरत है or। क्या ऐसा करने का अधिक संक्षिप्त तरीका है?

SELECT * FROM foobar WHERE
  (SUBJECT ='STAT' and TERM ='111') or  
  (SUBJECT ='STAT' and TERM ='222') or  
  (SUBJECT ='ENGLISH' and TERM ='555') or 
  (SUBJECT ='COMM' and TERM ='444') or
  (SUBJECT ='COMM' and TERM ='333') or  
  (SUBJECT ='STAT' and TERM ='666')
  ...

जवाबों:


21

आप इस तरह से कुछ पसंद कर सकते हैं:

select *
from foobar
where (subject,term) in ( ('STAT','111')
                         ,('STAT','222')
                         ,('ENGLISH','555')
                         ,('COMM','444')
                         ,('COMM','333')
                         ,('STAT','222')
                         ,('STAT','666') 
                        );

यहाँ DBFiddle


2
काश MS SQL Server में यह सिंटैक्स होता।
रोस प्रेसर

@RossPresser मुझे लगता है कि वाक्यविन्यास जोड़ने के लिए एक कनेक्ट आइटम / सुझाव है। आप मतदान कर सकते हैं;)
ypercubeᵀᴹ

मैंने पाया कि मोटे तौर पर सक्षम के रूप में कुछ है:SELECT * FROM foobar INNER JOIN (SELECT * FROM (VALUES ('4','a'),('5','b')) AS myTable(subject,term)) ON myTable.subject=foobar.table and mytable.term=foobar.term
रॉस प्रेसर

लेकिन मैं इस वास्तविक वाक्यविन्यास को पसंद करूंगा। किसी भी विचार जहां कनेक्ट आइटम है?
रोस प्रेसर

@RossPresser यह यहाँ है: ANSI मानक पंक्ति मान निर्माणकर्ताओं के लिए समर्थन जोड़ें । MS का उत्तर था: "नमस्ते। आपकी प्रतिक्रिया के लिए धन्यवाद। हम निश्चित रूप से SQL सर्वर के भविष्य के रिलीज़ के लिए पंक्ति मान निर्माणकर्ताओं पर विचार कर रहे हैं।" कम से कम अनुरोध अभी भी खुला है, 10 साल अभी।
ypercube y

11

शुद्ध कोड सफाई के संदर्भ में, निम्नलिखित साफ दिखता है:

SELECT * 
  FROM foobar 
  WHERE (SUBJECT = 'STAT' and TERM IN ('111','222','666') )
    OR  (SUBJECT = 'COMM' and TERM IN ('333','444') )
    OR  (SUBJECT = 'ENGLISH' and TERM = '555' ) ;

आवेदन के आधार पर और तर्क कितनी बार पुन: उपयोग किया जाएगा, यह तर्क लागू करने के लिए एक लुकअप तालिका स्थापित करने के लायक भी हो सकता है:

CREATE TABLE foobar_lookup (SUBJECT VARCHAR2(7), TERM VARCHAR2(3)) ;

INSERT INTO foobar_lookup SELECT 'STAT',    '111' FROM dual ;
INSERT INTO foobar_lookup SELECT 'STAT',    '222' FROM dual ;
INSERT INTO foobar_lookup SELECT 'STAT',    '666' FROM dual ;
INSERT INTO foobar_lookup SELECT 'COMM',    '444' FROM dual ;
INSERT INTO foobar_lookup SELECT 'COMM',    '333' FROM dual ;
INSERT INTO foobar_lookup SELECT 'ENGLISH', '555' FROM dual ;

SELECT f.* FROM foobar f
JOIN foobar_lookup fl 
    ON fl.subject = f.subject
    AND fl.term = f.term ;

4

यहाँ यह करने का एक और तरीका है। जहां (col1, col2) का उपयोग करके Oracle को किसी भी अनुक्रमणिका का उपयोग नहीं करने का कारण हो सकता है, लेकिन यह क्वेरी के लिए एक तालिका जैसा दिखता है, इसलिए यह बेहतर काम कर सकता है। विभिन्न संस्करणों का परीक्षण करने के बाद आपको पता चल जाएगा।

  WITH subject_terms 
            (subject,   term) AS
    ( SELECT 'STAT'   , '111' FROM dual UNION ALL
      SELECT 'STAT'   , '222' FROM dual UNION ALL
      SELECT 'ENGLISH', '555' FROM dual UNION ALL
      SELECT 'COMM'   , '444' FROM dual UNION ALL
      SELECT 'COMM'   , '333' FROM dual UNION ALL
      SELECT 'STAT'   , '666' FROM dual )
SELECT * 
  FROM foobar             fb
 INNER JOIN subject_terms st
    ON fb.subject = st.subject
   AND fb.term    = st.term;

DBFiddle यहाँ

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