문자제거 1 6 3,280

by 천사원이 [SQL Query] mssql [2025.03.10 11:01:31]


MSSQL 사용 하고 있습니다.

NVARCHAR로 선언된 컬럼에서 문자는 제거 하고 숫자만 가져오고 싶은데
한큐에 해결 할 수 있는 방법이 잇을까요...

01AA
02MM
03SS
04AD
01MM02AA
02SSMM01AA02AD

 

데이터가 이런식으로 들어가 있어서 REPLACE로 하나씩 제거 하기엔 너무 번거로울 것 같고..
끝에 두자리만 잘라내기엔 중간에 영문이 들어가 있는 경우도 있어서 잘 안되네요ㅠㅠ

01
0203
04
0102
020102

이런식으로 가져오고 싶습니다!

 

 

추가...

하이픈이 있는경우 하이픈은 유지되어야 합니다

01-03MM

01-03 으로 변환 할수있을까요?

by Hinori_ [2025.03.10 12:17:25]
1
2
-- MSSQL 2017부터
SELECT REPLACE(TRANSLATE('02SSMM01AA02AD', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'XXXXXXXXXXXXXXXXXXXXXXXXXX'), 'X', '')

 


by Hinori_ [2025.03.10 12:58:56]
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

 


by 아발란체 [2025.03.10 13:45:21]
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;

 


by 천사원이 [2025.03.10 17:07:59]

오... 고수님들 다들 감사드립니다..

혹시 추가로. 데이터를 보니 

01-3AA

이런식으로 중간에 하이픈이 들어간 자료도 확인 되어서.. 하이픈은 유지할 수 있을까요?

01-3 

이런식으로요...


by 마농 [2025.03.11 07:58:39]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WITH t AS
(
SELECT '01AA' v
UNION ALL SELECT '02MM'
UNION ALL SELECT '03SS'
UNION ALL SELECT '04AD'
UNION ALL SELECT '01MM02AA'
UNION ALL SELECT '02SSMM01AA02AD'
UNION ALL SELECT '01-03MM'
)
SELECT v
     , REPLACE(TRANSLATE(v, 'abcdefghijklmnopqrstuvwxyz', '                          '), ' ', '') x
  FROM t
;

 


by 아발란체 [2025.03.11 09:33:31]

정규식 이용하면, "\-" 만 추가하면 됩니다.

 

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;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입