Oracle
 sql >> база данни >  >> RDS >> Oracle

Заменете REGEXP_SUBSTR в SQL Server

SQL Fiddle

Настройка на схемата на MS SQL Server 2014 :

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 ALLSELECT 'BS_W0055785_C500_M0005672'; 

Заявка 1 :

WITH Names ( lvl, име, оставащи, idx ) AS ( SELECT 1, име, име, CHARINDEX( '_', име ) FROM table_name UNION ALL SELECT lvl+1, име, SUBSTRING(remaining,idx +1,LEN(оставащ)-idx), CASE WHEN CHARINDEX( '_', оставащ, idx+1 ) =0 THEN 0 ELSE CHARINDEX( '_', оставащ, idx+1 ) - idx END FROM Имена WHERE idx> 0)SELECT Name, MAX( CASE WHEN lvl =3 AND ( Name LIKE 'CG%' OR idx =0 ) THEN remaining WHEN lvl =3 THEN SUBSTRING( resting, 1, idx - 1 ) END ) AS OPT, MAX( CASE WHEN lvl =2 AND ( Име КАТО 'CG%' ИЛИ ​​idx =0 ) THEN оставащо WHEN lvl =2 THEN SUBSTRING( оставащо, 1, idx - 1 ) END ) AS Name2FROM NamesGROUP BY Име 

Резултати :

<предварителен код>| Име | ОПТ | Име2 ||--------------------------------|------------- ---------|------------------------------|| AE 344592001H 6186694 | (нула) | (нула) || 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 | (нула) | (нула) || UH_127757_RIV | RIV | 127757 || UH_141015_RHM | RHM | 141015 |

Заявка 2 :

CHARINDEX( expressionToFind, expressionToSerach[, startIndex] ) може да се използва за намиране на екземплярите на _ в думата.

  • CHARINDEX( '_', име ) ще намери индекса на първото копие на _ .
  • CHARINDEX( '_', име, CHARINDEX( '_', име ) + 1 ) ще намери индекса на второто копие на _ или ще върне 0 ако няма два _ знаци.
  • CHARINDEX( '_', име, CHARINDEX( '_', име, CHARINDEX( '_', име ) + 1 ) + 1) ще намери индекса на третото копие на _ или ще върне 0 ако няма три _ знаци.

Вмъквайки това във вътрешен избор, можете да го използвате, за да получите подходящия SUBSTRING s във външен избор по този начин:

ИЗБЕРЕТЕ име, CASE WHEN idx2> idx1 AND ( Име КАТО 'CG%' ИЛИ ​​idx3 =0 )THEN SUBSTRING( име, idx2 + 1, LEN( име ) ) WHEN idx3> idx2 THEN SUBSTRING( име, idx2 + 1, idx3 - idx2 - 1 ) END AS OPT, CASE WHEN име КАТО 'CG%' THEN SUBSTRING( име, idx1 + 1, LEN( име ) ) WHEN idx2> idx1 THEN SUBSTRING( име, idx1 + 1, idx2 - idx1 - 1 ) END AS Name2FROM ( SELECT име, CHARINDEX( '_', име ) AS idx1, CHARINDEX( '_', име, CHARINDEX( '_', име ) + 1 ) AS idx2, CHARINDEX( '_' , име, CHARINDEX( '_', име, CHARINDEX( '_', име ) + 1 ) + 1 ) AS idx3 FROM table_name) t 

Резултати :

<предварителен код>| име | ОПТ | Име2 ||--------------------------------|------------- ---------|------------------------------|| AE 344592001H 6186694 | (нула) | (нула) || 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 | (нула) | (нула) || 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. Как да съкратите TABLE в Oracle

  2. Изпълнение на незабавна промяна на променливата за свързване на потребителя

  3. Как да обединим група от записи в oracle?

  4. Oracle Sequence nextval е прескачане на число напред-назад

  5. Конкатенирането на числа в израз на виртуална колона хвърля ORA-12899:стойността е твърде голяма за колона