MSSQL 사용 하고 있습니다.
NVARCHAR로 선언된 컬럼에서 문자는 제거 하고 숫자만 가져오고 싶은데
한큐에 해결 할 수 있는 방법이 잇을까요...
01AA
02MM
03SS
04AD
01MM02AA
02SSMM01AA02AD
데이터가 이런식으로 들어가 있어서 REPLACE로 하나씩 제거 하기엔 너무 번거로울 것 같고..
끝에 두자리만 잘라내기엔 중간에 영문이 들어가 있는 경우도 있어서 잘 안되네요ㅠㅠ
01
0203
04
0102
020102
이런식으로 가져오고 싶습니다!
추가...
하이픈이 있는경우 하이픈은 유지되어야 합니다
01-03MM
01-03 으로 변환 할수있을까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | -- MSSQL 2017 미만 DECLARE @INPUT_STRING NVARCHAR(100) = 'ABC123DEF456GHI789XXX0' ; -- 숫자만 추출하여 결과를 반환 DECLARE @RESULT NVARCHAR(100) = '' ; -- 숫자만 추출하는 루프 WHILE LEN(@INPUT_STRING) > 0 BEGIN -- 첫 번째 문자를 추출 IF SUBSTRING (@INPUT_STRING, 1, 1) LIKE '[0-9]' BEGIN SET @RESULT = @RESULT + SUBSTRING (@INPUT_STRING, 1, 1); END -- 문자열에서 첫 번째 문자 제거 SET @INPUT_STRING = SUBSTRING (@INPUT_STRING, 2, LEN(@INPUT_STRING) - 1); END SELECT @RESULT |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | WITH T(val) AS ( SELECT '01AA' UNION ALL SELECT '02MM' UNION ALL SELECT '03SS' UNION ALL SELECT '04AD' UNION ALL SELECT '01MM02AA' UNION ALL SELECT '02SSMM01AA02AD' ) SELECT val,( SELECT STUFF(( SELECT '' + c FROM ( SELECT SUBSTRING (val, Number, 1) AS c FROM master.dbo.spt_values WHERE Type = 'P' AND Number BETWEEN 1 AND LEN(val) ) AS digits WHERE c LIKE '[0-9]' FOR XML PATH( '' ) ), 1, 0, '' ) ) AS only_num FROM T; |
정규식 이용하면, "\-" 만 추가하면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | WITH T(val) AS ( SELECT '01AA' UNION ALL SELECT '02M-M' UNION ALL SELECT '03SS' UNION ALL SELECT '04AD' UNION ALL SELECT '01MM02AA' UNION ALL SELECT '02SSMM01AA02AD' ) SELECT val,( SELECT STUFF(( SELECT '' + c FROM ( SELECT SUBSTRING (val, Number, 1) AS c FROM master.dbo.spt_values WHERE Type = 'P' AND Number BETWEEN 1 AND LEN(val) ) AS digits WHERE c LIKE '[0-9\-]' FOR XML PATH( '' ) ), 1, 0, '' ) ) AS only_num FROM T; |