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

SQL सर्वर में REGEXP_SUBSTR बदलें

SQL Fiddle

MS SQL सर्वर 2014 स्कीमा सेटअप :

CREATE TABLE table_name ( name VARCHAR(50) );
INSERT INTO table_name
SELECT 'AE 344592001H 6186694' UNION ALL
SELECT 'AE_161038002_6044777' UNION ALL
SELECT 'BC_VIVS_HNB011A_1WAM' UNION ALL
SELECT 'BC_56230A_30SP' UNION ALL
SELECT 'CG_3334902_NETWK_ ACTLM_3334912' UNION ALL
SELECT 'CG_3334574_HMO1_CORACT_3334575' UNION ALL
SELECT 'CG_3207160_POSC_1502AH_3207161' UNION ALL
SELECT 'UH_141015_RHM' UNION ALL
SELECT 'UH_127757_RIV' UNION ALL
SELECT 'UH 523725 RIV' UNION ALL
SELECT 'BS_W0055785_C500_M0005672';

क्वेरी 1 :

WITH Names ( lvl, name, remaining, idx ) AS (
  SELECT 1,
         name,
         name,
         CHARINDEX( '_', name )
  FROM   table_name
  UNION ALL
  SELECT lvl+1,
         name,
         SUBSTRING(remaining,idx+1,LEN(remaining)-idx),
         CASE WHEN CHARINDEX( '_', remaining, idx+1 ) = 0
              THEN 0
              ELSE CHARINDEX( '_', remaining, idx+1 ) - idx
              END
  FROM   Names
  WHERE  idx > 0
)
SELECT Name,
       MAX( CASE WHEN lvl = 3 AND ( Name LIKE 'CG%' OR idx = 0 ) THEN remaining
                 WHEN lvl = 3 THEN SUBSTRING( remaining, 1, idx - 1 )
                 END ) AS OPT,
       MAX( CASE WHEN lvl = 2 AND ( Name LIKE 'CG%' OR idx = 0 ) THEN remaining
                 WHEN lvl = 2 THEN SUBSTRING( remaining, 1, idx - 1 )
                 END ) AS Name2
FROM   Names
GROUP BY Name

परिणाम :

|                            Name |                  OPT |                        Name2 |
|---------------------------------|----------------------|------------------------------|
|           AE 344592001H 6186694 |               (null) |                       (null) |
|            AE_161038002_6044777 |              6044777 |                    161038002 |
|                  BC_56230A_30SP |                 30SP |                       56230A |
|            BC_VIVS_HNB011A_1WAM |              HNB011A |                         VIVS |
|       BS_W0055785_C500_M0005672 |                 C500 |                     W0055785 |
|  CG_3207160_POSC_1502AH_3207161 |  POSC_1502AH_3207161 |  3207160_POSC_1502AH_3207161 |
|  CG_3334574_HMO1_CORACT_3334575 |  HMO1_CORACT_3334575 |  3334574_HMO1_CORACT_3334575 |
| CG_3334902_NETWK_ ACTLM_3334912 | NETWK_ ACTLM_3334912 | 3334902_NETWK_ ACTLM_3334912 |
|                   UH 523725 RIV |               (null) |                       (null) |
|                   UH_127757_RIV |                  RIV |                       127757 |
|                   UH_141015_RHM |                  RHM |                       141015 |

प्रश्न 2 :

CHARINDEX( expressionToFind, expressionToSerach[, startIndex] ) _ . के उदाहरणों को खोजने के लिए इस्तेमाल किया जा सकता है शब्द में।

  • CHARINDEX( '_', name ) एक _ . के पहले उदाहरण की अनुक्रमणिका मिलेगी ।
  • CHARINDEX( '_', name, CHARINDEX( '_', name ) + 1 ) _ . के दूसरे इंस्टेंस का इंडेक्स मिलेगा या लौटाएगा 0 अगर दो नहीं हैं _ वर्ण।
  • CHARINDEX( '_', name, CHARINDEX( '_', name, CHARINDEX( '_', name ) + 1 ) + 1) _ . के तीसरे इंस्टेंस का इंडेक्स मिलेगा या लौटाएगा 0 अगर तीन नहीं हैं _ वर्ण।

इसे एक आंतरिक चयन में घोंसला बनाकर आप उपयुक्त SUBSTRING . प्राप्त करने के लिए इसका उपयोग कर सकते हैं इस तरह के बाहरी चयन में:

SELECT name,
       CASE WHEN idx2 > idx1 AND ( Name LIKE 'CG%' OR idx3 = 0 )THEN SUBSTRING( name, idx2 + 1, LEN( name ) )
            WHEN idx3 > idx2 THEN SUBSTRING( name, idx2 + 1, idx3 - idx2 - 1 )
            END AS OPT,
       CASE WHEN name LIKE 'CG%' THEN SUBSTRING( name, idx1 + 1, LEN( name ) )
            WHEN idx2 > idx1 THEN SUBSTRING( name, idx1 + 1, idx2 - idx1 - 1 )
            END AS Name2
FROM   (
  SELECT name,
         CHARINDEX( '_', name ) AS idx1,
         CHARINDEX( '_', name, CHARINDEX( '_', name ) + 1 ) AS idx2,
         CHARINDEX( '_', name, CHARINDEX( '_', name, CHARINDEX( '_', name ) + 1 ) + 1 ) AS idx3
  FROM   table_name
) t

परिणाम :

|                            name |                  OPT |                        Name2 |
|---------------------------------|----------------------|------------------------------|
|           AE 344592001H 6186694 |               (null) |                       (null) |
|            AE_161038002_6044777 |              6044777 |                    161038002 |
|            BC_VIVS_HNB011A_1WAM |              HNB011A |                         VIVS |
|                  BC_56230A_30SP |                 30SP |                       56230A |
| CG_3334902_NETWK_ ACTLM_3334912 | NETWK_ ACTLM_3334912 | 3334902_NETWK_ ACTLM_3334912 |
|  CG_3334574_HMO1_CORACT_3334575 |  HMO1_CORACT_3334575 |  3334574_HMO1_CORACT_3334575 |
|  CG_3207160_POSC_1502AH_3207161 |  POSC_1502AH_3207161 |  3207160_POSC_1502AH_3207161 |
|                   UH_141015_RHM |                  RHM |                       141015 |
|                   UH_127757_RIV |                  RIV |                       127757 |
|                   UH 523725 RIV |               (null) |                       (null) |
|       BS_W0055785_C500_M0005672 |                 C500 |                     W0055785 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL:तालिका से डेटा और विभाजन नाम का चयन करना और विभाजन को छोटा करना

  2. चूंकि SQL सर्वर में पैकेज नहीं होते हैं, प्रोग्रामर इसके आसपास जाने के लिए क्या करते हैं?

  3. PL/SQL ब्लॉक से SCRIPT चलाएँ

  4. एसक्यूएल एक कॉलम से अपर केस शब्दों को खोजने के लिए

  5. यदि पासवर्ड में विशेष वर्ण हैं तो JDBC का उपयोग करके Oracle डेटाबेस से कनेक्ट करने में सक्षम नहीं है