Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

खंड द्वारा सशर्त आदेश

यह बग 5695629 प्रतीत होता है, जो लगता है कि 10जी के विरुद्ध उठाया गया है और ऐसा लगता है कि अभी तक ठीक नहीं किया गया है (जैसा कि 12सीआर2; मेरे पास अभी तक खेलने के लिए 18 नहीं हैं), जो असामान्य है।

ऑर्डर करने से पहले आप क्वेरी को बाहरी चयन में लपेटकर इससे बच सकते हैं:

select name, grade, marks
from
(
    SELECT
        name, grade, marks
    FROM
        students, grades
    WHERE
        min_mark <= marks
        AND   marks <= max_mark
        AND   marks >= 70
    UNION
    SELECT
        TO_CHAR('NULL') AS name, grade, marks
    FROM
        students, grades
    WHERE
        min_mark <= marks
        AND   marks <= max_mark
        AND   marks <= 69
)
order by grade desc,case when grade >= 1 
                     then  name 
                     when grade < 1 
                     then  marks
                     end ;

लेकिन name . के रूप में और marks (संभवतः) विभिन्न डेटा प्रकार हैं - स्ट्रिंग और संख्या - जो इसके बजाय प्राप्त करेंगे

आप marks को रूपांतरित कर सकते हैं एक स्ट्रिंग के लिए, लेकिन यदि आप करते हैं तो आपको इसे पैड करने की आवश्यकता है ताकि परिणामी स्ट्रिंग को वर्णानुक्रम में क्रमबद्ध करना अभी भी संख्यात्मक क्रम से मेल खाता हो - गन्दा लेकिन व्यावहारिक हो सकता है क्योंकि अंक (फिर से, संभवतः - यदि यह प्रतिशत है?) केवल तीन अंकों तक हो सकता है :

select name, grade, marks
from
(
    ...
    <the main part of your query here as a subquery, as above>
    ...
)
order by grade desc,case when grade >= 8 
                     then  name 
                     when grade < 8 
                     then  to_char(marks, 'FM000')
                     end ;

db<>fiddle डेमो सीटीई के माध्यम से आपूर्ति किए गए कुछ डमी डेटा का उपयोग करना।

यदि अंक तीन अंकों से अधिक हो सकते हैं तो अधिकतम संभव लंबाई से मेल खाने के लिए प्रारूप मुखौटा बदलें।

TO_CHAR('NULL') भाग भी अजीब है क्योंकि यह आपको उन पंक्तियों के नाम कॉलम में शाब्दिक स्ट्रिंग "NULL" देगा। चूंकि आप एक स्ट्रिंग अक्षर से शुरू करते हैं TO_CHAR() भाग व्यर्थ है, बस 'NULL' AS name सीधे। यदि आप वास्तव में इसे खाली रखना चाहते हैं तो आप बस null AS name . का उपयोग कर सकते हैं और यह संघ की पहली शाखा से मेल खाने वाले कॉलम अभिव्यक्ति के डेटा प्रकार से मेल खाएगा (और इसके उपनाम भी उठाएगा)। आप स्पष्ट रूप से एक स्ट्रिंग प्रकार में डाल सकते हैं, उदा। cast(null as varchar2(20)) AS name लेकिन कुछ खास मायने नहीं रखता।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP से Oracle संग्रहीत कार्यविधि को कॉल करें

  2. DBMS_SCHEDULER.DROP_JOB केवल तभी मौजूद है

  3. Android को Oracle डेटाबेस से कैसे कनेक्ट करें?

  4. Oracle में किसी तिथि से महीने का नाम कैसे प्राप्त करें?

  5. Oracle sql में निकटतम तिथियाँ कैसे प्राप्त करें?