sql >> Database teknologi >  >> RDS >> Oracle

Erstat REGEXP_SUBSTR i SQL Server

SQL Fiddle

MS SQL Server 2014 Schema Setup :

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

Forespørgsel 1 :

WITH Names ( lvl, navn, resterende, idx ) AS ( SELECT 1, name, name, CHARINDEX( '_', name ) FRA tabelnavn UNION ALLE VÆLG lvl+1, navn, SUBSTRING(rest, idx +1,LEN(resterende)-idx), CASE WHEN CHARINDEX( '_', resterende, idx+1 ) =0 THEN 0 ELSE CHARINDEX( '_', resterende, idx+1 ) - idx END FROM Names WHERE idx> 0)VÆLG Navn, MAKS(CASE NÅR lvl =3 OG ( Navn SOM 'CG%' ELLER idx =0 ) SÅ resterende NÅR lvl =3 SÅ SUBSTRING(resterende, 1, idx - 1 ) END ) AS OPT, MAX(CASE NÅR lvl =2 OG ( Navn SOM 'CG%' ELLER idx =0 ) SÅ resterende NÅR lvl =2 SÅ SUBSTRING( resterende, 1, idx - 1 ) SLUT ) SOM Navn2FRA NavneGRUPPE EFTER Navn

Resultater :

| Navn | OPT | Navn2 ||--------------------------------|------------- ----------|-------------------------------------|| AE 344592001H 6186694 | (nul) | (nul) || 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 | (nul) | (nul) || UH_127757_RIV | RIV | 127757 || UH_141015_RHM | RHM | 141015 |

Forespørgsel 2 :

CHARINDEX( expressionToFind, expressionToSerach[, startIndex] ) kan bruges til at finde forekomsterne af __ i ordet.

  • CHARINDEX( '_', navn ) vil finde indekset for den første forekomst af en __ .
  • CHARINDEX( '_', navn, CHARINDEX( '_', navn ) + 1 ) vil finde indekset for den anden forekomst af en __ eller returnerer 0 hvis der ikke er to __ tegn.
  • CHARINDEX( '_', navn, CHARINDEX( '_', navn, CHARINDEX( '_', navn ) + 1 ) + 1) vil finde indekset for den tredje forekomst af en __ eller returnerer 0 hvis der ikke er tre __ tegn.

Ved at indlejre dette i et indre udvalg kan du bruge det til at få den passende SUBSTRING s i et ydre udvalg som dette:

VÆLG navn, CASE WHEN idx2> idx1 AND ( Navn SOM 'CG%' ELLER idx3 =0 )THEN SUBSTRING( navn, idx2 + 1, LEN( navn ) ) NÅR idx3> idx2 SÅ SUBSTRING( navn, idx2 + 1, idx3 - idx2 - 1 ) END AS OPT, CASE NÅR navn SOM 'CG%' SÅ SUBSTRING( navn, idx1 + 1, LEN( navn ) ) NÅR idx2> idx1 SÅ SUBSTRING( navn, idx1 + 1, idx2 - idx1 - 1 ) END AS Name2FROM ( SELECT name, CHARINDEX( '_', name ) AS idx1, CHARINDEX( '_', name, CHARINDEX( '_', name ) + 1 ) AS idx2, CHARINDEX( '_' , navn, CHARINDEX( '_', navn, CHARINDEX( '_', navn ) + 1 ) + 1 ) SOM idx3 FRA tabelnavn) t 

Resultater :

| navn | OPT | Navn2 ||--------------------------------|------------- ----------|-------------------------------------|| AE 344592001H 6186694 | (nul) | (nul) || 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 | (nul) | (nul) || BS_W0055785_C500_M0005672 | C500 | W0055785 |


  1. Looping gennem en given liste over værdier i PL/pgSQL

  2. Opsætning af Django med GeoDjango Support i AWS Beanstalk eller EC2 Instance

  3. Sådan beskytter du din MySQL &MariaDB-database mod cyberangreb, når du er på et offentligt netværk

  4. Få tidspunktet for en datetime ved hjælp af T-SQL?