मैं एसक्यूएल ऑरैकल में नया हूं और मुझे यहां समस्या है कि केस का उपयोग कैसे करें, उदाहरण के लिए यह मामला है:

  1. यदि लेनदेन_प्रकार प्राप्त होता है तो रसीद की तारीख - वादा की गई तारीख

  2. अगर रसीद की तारीख> वादा की गई तारीख तो रसीद की तारीख - वादा की गई तारीख

  3. अगर रसीद की तारीख <= वादा की गई तारीख तो अशक्त

  4. अगर अभी तक प्राप्त नहीं हुआ है या लेन-देन_टाइप डिलीवर तो sysdate - वादा किया गया दिनांक

    CASE WHEN transaction_type ='RECEIVE' THEN to_char(creation_date, 'DD-MON-YYYY') – to_char(promised_date, 'DD-MON-YYYY')
      WHEN to_char(creation_date, 'DD-MON-YYYY') > to_char(promised_date, 'DD-MON-YYYY') THEN to_char(creation_date, 'DD-MON-YYYY') – to_char(promised_date, 'DD-MON-YYYY')
      WHEN to_char(creation_date, 'DD-MON-YYYY') <= to_char(promised_date, 'DD-MON-YYYY') THEN null
      WHEN transaction_type ='DELIVER' THEN to_char(sysdate, 'DD-MON-YYYY') - to_char(promised_date, 'DD-MON-YYYY') END AS delay_day
    

ORA-00911: अमान्य वर्ण 00911. 00000 - "अमान्य वर्ण" *कारण: पहचानकर्ता का नाम a . के अलावा ASCII वर्ण से शुरू होता है पत्र या संख्या। पहचानकर्ता के पहले अक्षर के बाद नाम, ASCII वर्णों की अनुमति है जिनमें "$", "#" और "_" शामिल हैं। दोहरे उद्धरण चिह्नों में संलग्न पहचानकर्ताओं में कोई भी हो सकता है दोहरे उद्धरण के अलावा अन्य चरित्र। वैकल्पिक उद्धरण मार्क्स (q'#...#') रिक्त स्थान, टैब या कैरिज रिटर्न का उपयोग नहीं कर सकते क्योंकि सीमांकक अन्य सभी संदर्भों के लिए, SQL भाषा देखें संदर्भ पुस्तिका। * क्रिया: Oracle पहचानकर्ता नामकरण परंपरा की जाँच करें। अगर आप के खंड द्वारा पहचान में पासवर्ड प्रदान करने का प्रयास एक उपयोगकर्ता बनाएं या उपयोगकर्ता कथन बदलें, तो इसकी अनुशंसा की जाती है पासवर्ड को हमेशा दोहरे उद्धरण चिह्नों में संलग्न करें क्योंकि फिर दोहरे उद्धरण के अलावा अन्य वर्णों की अनुमति है। लाइन में त्रुटि: २१ कॉलम: ९४

और यह त्रुटि है और मुझे नहीं पता कि इसमें क्या गलत है

0
tsarah 14 अक्टूबर 2020, 11:34

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि आपने कुछ फैंसी टेक्स्ट एडिटर (एमएस वर्ड, शायद?) से कोड कॉपी/पेस्ट किया है जो सिंगल और डबल कोट्स के लिए फैंसी वर्णों का उपयोग करता है, साथ ही साथ माइनस संकेत। अगर "सामान्य" माइनस - में बदल दिया जाता है, तो यह चाहिए ठीक होना चाहिए:

      CASE
          WHEN transaction_type = 'RECEIVE'
          THEN
               TO_CHAR (creation_date, 'DD-MON-YYYY')
             - TO_CHAR (promised_date, 'DD-MON-YYYY')         --> this minus
          WHEN TO_CHAR (creation_date, 'DD-MON-YYYY') >
               TO_CHAR (promised_date, 'DD-MON-YYYY')
          THEN
               TO_CHAR (creation_date, 'DD-MON-YYYY')
             - TO_CHAR (promised_date, 'DD-MON-YYYY')         --> and this minus
          WHEN TO_CHAR (creation_date, 'DD-MON-YYYY') <=
               TO_CHAR (promised_date, 'DD-MON-YYYY')
          THEN
             NULL
          WHEN transaction_type = 'DELIVER'
          THEN
               TO_CHAR (SYSDATE, 'DD-MON-YYYY')
             - TO_CHAR (promised_date, 'DD-MON-YYYY')
       END AS delay_day

हालांकि: परिणामस्वरूप आप क्या प्राप्त करने की अपेक्षा करते हैं? दो स्ट्रिंग्स का घटाना हास्यास्पद है। 'A' - '23FX__#' क्या है? यदि आप तिथियां घटाना चाहते हैं, तो निश्चित रूप से - क्यों नहीं - परिणाम उन दो तिथियों के बीच दिनों की संख्या होगी।

इसके अलावा, तार की तुलना करना ज्यादातर मामलों में काम नहीं करेगा।

इसका मतलब है कि आपको - शायद - TO_CHAR को पूरी तरह से हटा देना चाहिए।

        CASE
          WHEN transaction_type = 'RECEIVE'
          THEN
             creation_date - promised_date
          WHEN creation_date > promised_date
          THEN
             creation_date - promised_date
          WHEN creation_date <= promised_date
          THEN
             NULL
          WHEN transation_type = 'DELIVER'
          THEN
             SYSDATE - promised_date
       END AS delay_day
1
Littlefoot 14 अक्टूबर 2020, 12:11