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
| 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 returnerer0
hvis der ikke er to__
tegn.CHARINDEX( '_', navn, CHARINDEX( '_', navn, CHARINDEX( '_', navn ) + 1 ) + 1)
vil finde indekset for den tredje forekomst af en__
eller returnerer0
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
| 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 |