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

Oracle में mysql के Find_in_set का विकल्प क्या है?

MySQL के FIND_IN_SET , लेकिन आपके उदाहरण के मामले में (जहां आपको केवल यह जानने की आवश्यकता है कि क्या कोई मान अल्पविराम से अलग किए गए सेट में निहित है) Oracle का REGEX_COUNT रेगेक्स '^([^,]+,)*your_value(,[^,]+)*$' के साथ फिट होगा।

निम्नलिखित SQL प्रश्नों की जाँच करें (Oracle के लिए)...

संख्याओं वाले उदाहरण

नंबर खोजें 1 सेट में:[1,2,3,4,5,6,11,12,13]

SELECT
    CASE WHEN REGEXP_COUNT('1,2,3,4,5,6,11,12,13', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END AS cnt
FROM DUAL;

रिटर्न 1 सही ढंग से

नंबर खोजें 1 सेट में:[111,222,333]। इस मामले में INSTR नकारात्मक रिपोर्ट करने में विफल रहेगा।

SELECT
    CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END AS cnt
FROM DUAL;

रिटर्न 0 सही ढंग से

स्ट्रिंग वाले उदाहरण

'John' के लिए खोजें नामों के समूह में:

SELECT
    CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*John(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

रिटर्न 1 सही ढंग से

लेकिन अगर आप 'a' letter अक्षर सर्च करते हैं , यह सही ढंग से शून्य लौटाएगा (INSTR फिर से विफल हो जाएगा)।

SELECT
    CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*a(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

रिटर्न 0 सही ढंग से

मुझे पता है कि इस प्रश्न का उत्तर बहुत पहले दिया जा चुका है, लेकिन यह खोज परिणामों में अच्छी तरह से रैंक करता है और शायद अन्य लोगों की मदद कर सकता है जो Oracle के INSTR की तुलना में एक सादे लेकिन अधिक सही समाधान की तलाश में हैं। समारोह।

बूलियन एक्सप्रेशन

बूलियन अभिव्यक्तियों का उपयोग करना भी संभव है, जैसे OR या AND

OR . का उपयोग करने वाला एक उदाहरण निम्नलिखित है:

SELECT
    CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*(helen|peter)(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

रिटर्न 1 सही ढंग से, जैसा कि इसे "पीटर" मिला (या तो "हेलेन" . के लिए खोजें या "पीटर" )।

AND के लिए दृष्टिकोण थोड़ा अलग है (CASE अभिव्यक्ति में संशोधन करता है रेगेक्स . के बजाय ):

SELECT
    CASE WHEN
            REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*john(,[^,]+)*$', 1, 'i') > 0 AND
            REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*peter(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

उपरोक्त क्वेरी "जॉन" . दोनों के लिए खोज करती है और "पीटर" . AND REGEXP_COUNT . की नकल करके ऑपरेशन को आसानी से लागू किया जा सकता है CASE . में अभिव्यक्ति सिंटैक्स, हालांकि बदले में एक छोटे से प्रदर्शन दंड के साथ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. HikariCP 1.4.0 MBean InstanceNotFoundException

  2. एक सत्र द्वारा निष्पादित Oracle प्रश्न

  3. मैं असंबंधित तालिकाओं के बीच अखंडता कैसे सुनिश्चित करूं?

  4. Oracle पिवट क्वेरी कॉलम नामों के आसपास उद्धरणों के साथ कॉलम देती है। क्या?

  5. Oracle के RAW(16) से .NET के GUID में कनवर्ट करें