यह बग 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
लेकिन कुछ खास मायने नहीं रखता।