개발
백엔드
MSSQL 데이터 수정(보정) 쿼리문
목차
웹 개발을 하다보면 디비이전을 하는 경우가 종종있다.
내가 작업하는 환경은 mysql(mariadb) 환경이라 같은 db사이에서는 무난하게 이전작업을 할 수 있긴하다.
하지만 외부 데이터를 이전할때 이전 db가 mssql인 경우도 정말 많다.
대표적으로 ASP로 구현된 윈도우 서버의 경우엔 mssql을 db로 쓰는 사이트가 많기때문이다.
mssql 자체가 애초에 구형 디비여서 mssql 위에서 무슨 작업을 한다기보다는 빠르게 추출해서 mysql로 옮긴다음에 작업하는게 편하긴하다.
대신 데이터 보정이 필요한 경우에는 이를 좀 미리 수정해둔다음 추출하는게 훨씬 편한 부분도 많다.
요즘은 GPT를 통해서 쉽게 쿼리문을 만들 수 있어서 참 편하긴한데, 많이 반복적으로 쓰는 쿼리문은 여기다가 기록해놓고 나중에 응용할 수 있도록 해보려고 한다.
특정 문자 대체
보통 전화번호 작업에서 나오는 보정작업 건이다.
옛날 홈페이지들은 전화번호를 그냥 일반 text로 받는경우가 많아서 "010-0000-0000" 처럼 데이터가 있는가하면 누구는 "010)0000-0000", "01000000000" 이런식으로 데이터를 저장하기도한다.
이를 보정하기위해서는 먼저 대쉬가 아닌 특수문자를 변경하는 쿼리문을 아래와 같이 작성해볼 수 있다.
SET Memb_MeHP = REPLACE(Memb_MeHP, ')', '-')
WHERE Memb_MeHP LIKE '%)%';
UPDATE member
SET Memb_MeHP = REPLACE(Memb_MeHP, '=', '-')
WHERE Memb_MeHP LIKE '%=%';
UPDATE member
SET Memb_MeHP = REPLACE(Memb_MeHP, ')', '-')
WHERE Memb_MeHP LIKE '%)%';
Copy
그리고 변환된 데이터를 바탕으로 너무짧은 전번(잘못입력한경우)나 대쉬를 사용하지 않는 전번등을 검색해 추가 보정을 진행할 수 있다.
-- 너무 짧은 값 제거
SELECT *
FROM member
WHERE LEN(Memb_MeHP) < 8;
-- 전번 대쉬 보정
SELECT *
FROM member
WHERE Memb_MeHP NOT LIKE '%-%';
Copy
특히 옛날에는 "0311234567", "03112345678"처럼 10자리 전화번호와 11자리 전화번호의 경우에는 글자수에 따라서 3-3-4, 3-4-4 구조로 넣는 업데이트문을 일일히 만들어서 사용했는데, 요즘은 이런 부분을 지피티한테 시켜서 변환된 데이터를 다시 직접 갱신해주면되서 겁나 편해졌다.
그래도 초대량데이터의 경우엔 아직도 쿼리문으로 처리해야하는 부분이 있긴하지만 말이다.
UPDATE users
SET phone =
CASE
WHEN LEN(phone) = 10 THEN
SUBSTRING(phone, 1, 3) + '-' + SUBSTRING(phone, 4, 3) + '-' + SUBSTRING(phone, 7, 4)
WHEN LEN(phone) = 11 THEN
SUBSTRING(phone, 1, 3) + '-' + SUBSTRING(phone, 4, 4) + '-' + SUBSTRING(phone, 8, 4)
ELSE
phone -- 10자리, 11자리가 아닌 경우는 변경하지 않음
END
WHERE LEN(phone) IN (10, 11);
Copy
위 기능을 유사하게 쿼리문으로 만든다면 이런느낌으로 만들 수 있을것이다.
이메일 유효값 보정
보통 회원계정찾기를하면 가장많이 쓰는 폼이 이메일과 휴대번호다.
그래서 이 두가지는 이전하기전에 꼭 유효값인지 처리하는 습관이 나한텐 있다.
이메일의 경우에는 당연히 악의적인 가입 이메일을 걸러내는 작업도해야하지만, 원초적으로 이메일란에 이메일형식을 취하지 못한 데이터를 걸러내는게 1순위다.
-- 이메일 보정
SELECT *
FROM member
WHERE Memb_Mail IS NOT NULL
AND (
Memb_Mail NOT LIKE '%@%.%'
OR Memb_Mail LIKE '%@%@%'
OR Memb_Mail LIKE '@%'
OR Memb_Mail LIKE '%@'
OR Memb_Mail LIKE '%.@%'
OR Memb_Mail LIKE '%@%.'
OR LEN(Memb_Mail) < 5
);
Copy
이런경우는 위와같은 셀렉문을 통해서 잘못된 이메일을 추려낼 수 있고, 해당 레코드를 나는 삭제하는 방식으로 보정하고 있다.
결론
이 개발기록을 작성한 이유는 내가 평소에 자주쓰는 mysql이 아닌 mssql에서의 쿼리문을 기록하기 위해서다.
아무리 둘다 기본적은 sql 쿼리문의 형식을 띈다해도 조금만 복잡한 단계로 넘어가면 은근히 사용할 수 있는 함수명이 다르다던지, 자료형의 제약이 존재하기 때문이다.
항목 | MySQL | MSSQL (SQL Server) |
---|---|---|
문자열 길이 계산 | CHAR_LENGTH( ), LENGTH( ) | LEN( ) |
문자열 연결 | CONCAT(str1, str2) | + or CONCAT(str1, str2) |
조건문 | IF(condition, true_value, false_value) | CASE WHEN condition THEN true_value ELSE false_value END |
현재 날짜/시간 | NOW( ) | GETDATE( ) |
AUTO_INCREMENT | AUTO_INCREMENT | IDENTITY(1, 1) |
주석 | -- or # or /* */ | -- or /* */ |
디테일하게 따지자면 위의 비교항목 말고도 더 있긴하다만(예를들어 mssql은 특정 문자열 작업을 할때 varchar 변환을 해줘야 한다든지) 실질적으로 쿼리문을 만들때 mssql이 구형 느낌이 많이 나긴한다.
내 전문영역은 아니다만 디비이전을 해야하는 업무특성상 관련 부분에 대한 지식도 있어야 한다는게 좀 슬픈일이다.
끝!
#SQL
0
개의 댓글
백엔드 콜렉션의 다른 글
개발 카테고리의 다른 글
04/14
MPEGTS 컨테이너 파일 MP4로 변환하는 법
개인적인 공간에서 PLEX로 영상을 관리하는데 일부기기에서 영상재생이 안된다는 내용을 받게되었다.무슨문제인가 싶어 해당 영상의 정보를 확인해 봤는데, 코덱이나 영상자체는 문제가 없었다. 단 영상의 Container가 처음보는 MPEGTS 값으로 되어있었다.이게 뭔가해서 알아보니 MPEGTS는 MPEG-TS(Transport Steam)으로 방...

04/02
유희왕 초동 확률 계산기 제작
오랜만에 덱 연구를 좀 하다가 초동확률을 계산해보고 싶어서 초동확률 계산기를 찾으러 가보았다.예전엔 유기오.파티라는 도메인에서 초동확률 계산기를 사용했었는데, 지금 해당 사이트에 뭔 문제가 생겼는지 사이트가 열리지 않게 되었다. 그이후에는 여러 확률 계산기 사이트를 돌아다니면서 몇개 보았지만 그냥 직관적...

03/20
라라벨에서 RSS / ATOM 피드 생성기 구현하기
진짜 오랜만에 개발글 하나 써봅니다. 오늘 소개할 내용은 대부분의 블로그에서 RSS 피드를 제공하는데, 그 RSS 피드를 직접 만든 사이트에서 제공하기위해 RSS 구조를 맞추어 XML 형태의 결과를 생성하는 방법이다. RSS/ATOM 피드는 2000년대 초반부터 특정 사이트에서 발행하는 글을 직접 사이트에 들어가지 않고 '구독'...