একাধিক `or` এক্সপ্রেশন এড়ানো


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') 
                        );

এখানে ডিবিফিডাল


2
আমার ইচ্ছা এমএস এসকিউএল সার্ভারের এই সিনট্যাক্সটি ছিল।
রস প্রেসার

@ রোসপ্রেসার আমার মনে হয় সিনট্যাক্স যুক্ত করার জন্য একটি সংযোগ আইটেম / পরামর্শ রয়েছে। আপনি ভোট দিতে পারেন;)
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
রস প্রেস

তবে আমি এই প্রকৃত বাক্য গঠন চাই like কানেক্ট আইটেমটি কোন ধারণা?
রস প্রেসার

@ রসপ্রেসার এটি এখানে: এএনএসআই স্ট্যান্ডার্ড সারি মান নির্মাতাদের জন্য সমর্থন যুক্ত করুন এমএসের উত্তর ছিল: "হ্যালো। আপনার মতামতের জন্য আপনাকে ধন্যবাদ। আমরা অবশ্যই এসকিউএল সার্ভারের ভবিষ্যতের মুক্তির জন্য সারি মান নির্মাতাদের বিবেচনা করছি।" কমপক্ষে অনুরোধটি এখনও 10 বছর পরে খোলা আছে।
ypercubeᵀᴹ

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

এটি করার আরেকটি উপায় এখানে। যেখানে (কল 1, কল 2) ব্যবহার করার ফলে ওরাকল কোনও সূচক ব্যবহার না করার কারণ হতে পারে, তবে এটি ক্যোয়ারীর জন্য একটি টেবিলের মতো দেখাচ্ছে, সুতরাং এটি আরও ভাল কাজ করতে পারে। আপনি বিভিন্ন সংস্করণ একবার পরীক্ষা করে জানতে পারবেন।

  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;

এখানে ডিবিফিডাল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.