Mssql 문자열 찾기 - mssql munjayeol chajgi

  • -- 컬럼 검색 
    SELECT DISTINCT
           T.NAME AS TABLE_NAME
       FROM SYS.TABLES AS T
      INNER JOIN SYS.COLUMNS AS C
         ON T.OBJECT_ID = C.OBJECT_ID
      WHERE C.NAME LIKE '%부서%'
    
    --문자열 찾기 
    SELECT DISTINCT OBJECT_NAME(ID)
    FROM SYS.SYSCOMMENTS
    WHERE TEXT LIKE '%내가찾을문자열%'

    TAG


프로그래밍/MSSQL

2017. 2. 13. 11:41

Mssql 문자열 찾기 - mssql munjayeol chajgi

문자열 자르기 함수

RIGHT

문자열을 오른쪽에서부터 길이만큼 출력한다.

SELECT RIGHT('안녕하세요', 3) -- 하세요

REVERSE

문자열을 거꾸로 출력한다.

SELECT REVERSE('안녕하세요') -- 요세하녕안

CHARINDEX

SELECT CHARINDEX(검색할문자, 문자열, [시작위치])

문자열에서 특정 문자의 위치를 검색한다.

SELECT CHARINDEX('안', '안녕하세요안녕하세요') -- 결과 : 1
 
SELECT CHARINDEX('안', '안녕하세요안녕하세요', 2) -- 결과 : 6
-- 시작점이 첫번째 '안' 뒤에서 부터이기 때문에, 그 이후의 '안'의 위치가 출력

PATHINDEX

SELECT PATHINDEX('%검색할문자%', 문자열)

특정 문자를 찾는 CHARINDEX로 와 달리 PATHINDEX는 패턴을 설정하여 검색한다.

SELECT PATINDEX ('%[0-9]%', '손꽁쥐27살')
SELECT PATINDEX ('%꽁%', '손꽁쥐27살')

Mssql 문자열 찾기 - mssql munjayeol chajgi
결과 데이터

예제

특정 구분자를 기준으로 문자열을 잘라보자

단, 문자열에서 구분자를 찾을 때 그 기준은 뒤에서부터이다.

'D:\TEST\GO\테스트_문서.txt' 라는 문자열이 존재한다.

이때, 내가 필요한 문자열은 '테스트_문서.txt'이다.

따라서 문자열을 구분자 \를 기준으로 자르되, 가장 뒤에 해당하는 문자를 가져와야한다.

즉, 문자열을 뒤에서부터 잘라야한다.

RIGHT, REVERSE, CHARINDEX 함수를 이용해서 다음과 같은 쿼리를 작성하면, 원하는 결과를 얻을 수 있다.

DECLARE @Str VARCHAR(100) = 'D:\TEST\GO\테스트_문서.txt'
SELECT RIGHT(@Str, CHARINDEX('\', REVERSE(@Str))-1)

결과 데이터


PADINDEX는 문자열 비교시 패턴매칭을 사용하여 해당문자열의 위치를 찾을수 있게해주는 함수입니다. 해당함수와 패턴을 적절히 사용하면 문자열값중 숫자값만 있는지, 특수문자가 있는지, 한글값이 있는지등을 체크할수 있습니다. 그럼 먼저 PADINDEX의 구문정보를 알아보겠습니다.

1. PADINDEX 구문
표현식(expression)에서 패턴이 처음 나타나는 시작 위치를 반환하거나 패턴을 찾지 못하면 0을 반환합니다.

PADINDEX ('%pattern%',expression)

2. 패턴 매칭 (Pattern)
UNIX에 주로 사용되는데 MSSQL에서도 비슷하게 사용되고 패턴매칭에 사용대는 와일드카드는 아래와 같습니다.

Mssql 문자열 찾기 - mssql munjayeol chajgi

3. PADINDEX예제
패턴매칭을 사용해서 해당문자열에 어떻게 결과값이 나오는지 확인해보겠습니다. Padindex Test라는 표현식을 가지고 문자열 포함유무에 대하여 테스트해보겠습니다. [e]의패턴은 e글자가 있을경우에는 해당문자열 시작위치값이 반환이되고 없을경우에는 0이 반환됩니다. [^e]의 경우는 반대로 e를 제외한 다른값이 올경우에는 해당문자가 발견된 위치값이 나오고, 해당값이 있을경우에는 0이 반환됩니다.

SELECT PATINDEX('%T%'    , 'Padindex Test') 결과1    

SELECT PATINDEX('%T[e]%' , 'Padindex Test') 결과2    

SELECT PATINDEX('%T[c]%' , 'Padindex Test') 결과3

SELECT PATINDEX('%T[^e]%''Padindex Test') 결과4

SELECT PATINDEX('%T[^c]%''Padindex Test') 결과5  

SELECT PATINDEX('%T[^c]%''P')             결과6

SELECT PATINDEX('%T[^c]%''T')             결과7

쿼리결과

Mssql 문자열 찾기 - mssql munjayeol chajgi

4. 특수문자가 있는지 확인
패턴을 이용해서 문자열내에 영문/숫자를 제외한 값이 있는지 확인해보도록 하겠습니다. 한글에 대한 부분은 예외로 하고 영문/숫자/스페이스를 제외한 데이터가 특수문자라고 가정하고 패턴을 만들어보겠습니다.

1

2

3

4

5

6

7

8

9

10

11

12

declare @d1 varchar(max)

declare @d2 varchar(max)

declare @d3 varchar(max)

declare @d4 varchar(max)

set @d1 = 'Find Special Characters!' 

set @d2 = '0231asfd11 abc' 

set @d3 = '0231asfd11 안녕' 

SELECT PATINDEX('%[^a-zA-Z0-9 ]%', @d1)

SELECT PATINDEX('%[^a-zA-Z0-9 ]%', @d2)

SELECT PATINDEX('%[^a-zA-Z0-9 ]%', @d3)

쿼리결과

Mssql 문자열 찾기 - mssql munjayeol chajgi


5. PADINEX이용 숫자값만 추출 

패턴을 이용해서 문자값에서 숫자만 추출해보도록 하겠습니다. 와일드카드값만 잘 활용하면됩니다.
숫자만 추출하는 스크립트입니다. stuff함수를 사용해서 숫자가 아닐경우에는 해당값을 지우도록 하겠습니다. 

1

2

3

4

5

6

7

8

9

10

11

12

13

declare @d1 varchar(max)

declare @pos int = 1 

set @d1 = 'Find 112354 안녕 Special Characters!0'  

while @pos > 0 

begin

set @pos = PATINDEX('%[^0-9]%', @d1)

if @pos >0

begin

set @d1 = stuff(@d1,@pos,1,'')

end 

end 

select @d1

쿼리결과

Mssql 문자열 찾기 - mssql munjayeol chajgi


출처,참고)
https://docs.microsoft.com/ko-kr/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver15
https://docs.microsoft.com/ko-kr/sql/t-sql/functions/patindex-transact-sql?view=sql-server-ver15