프로그래머스 SQL 풀이 오답노트(4)

SeongGyun Hong·2025년 1월 5일

SQL

목록 보기
28/51

SQL Server와 Oracle에서 문자열 찾기 및 위치 반환 정리

1. 문자열 찾아서 1 또는 0으로 반환

SQL Server

SQL Server에서는 특정 문자열의 존재 여부를 확인하기 위해 CHARINDEX 또는 PATINDEX를 사용한다. 이를 활용해 문자열이 존재하면 1(True), 존재하지 않으면 0(False)으로 반환하도록 처리할 수 있다.

1.1 CHARINDEX 사용 예시

SELECT
    CASE
        WHEN CHARINDEX('abc', column_name) > 0 THEN 1
        ELSE 0
    END AS IsMatch
FROM table_name;
  • 설명:
    • CHARINDEX('abc', column_name) > 0: 문자열 'abc'가 열(column_name)에 존재하면 위치값(1 이상의 값)을 반환. 존재하지 않으면 0을 반환.
    • CASE를 사용해 1(True) 또는 0(False)으로 변환.

1.2 PATINDEX 사용 예시

SELECT
    CASE
        WHEN PATINDEX('%abc%', column_name) > 0 THEN 1
        ELSE 0
    END AS IsMatch
FROM table_name;
  • 설명:
    • PATINDEX('%abc%', column_name): 와일드카드(%)를 포함한 패턴 매칭이 가능.
    • 'abc'가 포함된 경우 위치값 반환, 없으면 0 반환.

1.3 IIF로 간단히 작성(SQL Server 2012 이상)

SELECT
    IIF(CHARINDEX('abc', column_name) > 0, 1, 0) AS IsMatch
FROM table_name;
  • 설명:
    • IIF를 사용하면 조건문을 간결하게 작성 가능.

1.4 Boolean 값으로 반환

SELECT
    CAST(CASE WHEN CHARINDEX('abc', column_name) > 0 THEN 1 ELSE 0 END AS BIT) AS IsMatch
FROM table_name;
  • 설명:
    • CAST(... AS BIT)를 사용해 결과를 Boolean 형식처럼 처리.

이외에도 , 그냥 특정 문자열 찾아서 True False에 따라 WHERE 조건 걸라면 LIKE 쓰면 편하다.

SELECT WAREHOUSE_ID, 
       WAREHOUSE_NAME, 
       ADDRESS, 
       COALESCE(FREEZER_YN, 'N') AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE WAREHOUSE_NAME LIKE '%경기%';

Oracle

Oracle에서는 정규표현식을 기본적으로 지원하며, REGEXP_LIKE를 사용해 특정 문자열의 존재 여부를 확인할 수 있다.

1.1 REGEXP_LIKE 사용 예시

SELECT
    CASE
        WHEN REGEXP_LIKE(column_name, 'abc') THEN 1
        ELSE 0
    END AS IsMatch
FROM table_name;
  • 설명:
    • REGEXP_LIKE(column_name, 'abc'): 정규표현식으로 'abc'를 포함하는지 확인.
    • CASE로 1(True) 또는 0(False) 반환.

1.2 Boolean 값처럼 처리

Oracle은 Boolean 자료형을 직접 지원하지 않지만, 아래와 같이 처리 가능:

SELECT
    CASE
        WHEN REGEXP_LIKE(column_name, 'abc') THEN 1
        ELSE 0
    END AS IsMatch
FROM table_name;
  • 설명:
    • Boolean 값을 숫자로 대체.

2. 문자열의 위치 찾기

SQL Server

SQL Server에서는 특정 문자열의 위치를 찾기 위해 CHARINDEX 또는 PATINDEX를 사용한다.

2.1 CHARINDEX 사용 예시

SELECT CHARINDEX('abc', column_name) AS MatchPosition
FROM table_name;
  • 설명:
    • CHARINDEX('abc', column_name): 문자열 'abc'의 시작 위치를 반환. 없으면 0을 반환.

2.2 PATINDEX 사용 예시

SELECT PATINDEX('%abc%', column_name) AS MatchPosition
FROM table_name;
  • 설명:
    • PATINDEX('%abc%', column_name): 와일드카드를 포함한 패턴 매칭의 시작 위치를 반환. 없으면 0을 반환.

Oracle

Oracle에서는 문자열 위치를 찾기 위해 INSTR 또는 정규표현식을 사용할 수 있다.

2.1 INSTR 사용 예시

SELECT INSTR(column_name, 'abc') AS MatchPosition
FROM table_name;
  • 설명:
    • INSTR(column_name, 'abc'): 문자열 'abc'의 시작 위치를 반환. 없으면 0 반환.

2.2 REGEXP_INSTR 사용 예시

SELECT REGEXP_INSTR(column_name, 'abc') AS MatchPosition
FROM table_name;
  • 설명:
    • REGEXP_INSTR(column_name, 'abc'): 정규표현식 기반으로 문자열 'abc'의 시작 위치를 반환. 없으면 0 반환.

3. ISNULL

SQL Server에서는 ISNULL(칼럼, 대체)
이렇게 쓸 수 있지만
다른 DBMS에서도 사용하려면
COALESCE(칼럼, 대체) 로 쓰는 것이 좋다.


요약

기능SQL ServerOracle
문자열 존재 여부 확인CHARINDEX, PATINDEXREGEXP_LIKE
문자열 위치 찾기CHARINDEX, PATINDEXINSTR, REGEXP_INSTR
Boolean 반환CAST(... AS BIT) 또는 CASE로 처리CASE와 정규표현식을 조합하여 구현

SQL Server는 간단한 패턴 매칭에 적합한 PATINDEX, Oracle은 정규표현식 기반의 유연한 문자열 처리가 가능하다. 두 DB의 장단점을 이해하고 적절한 함수를 활용하면 효율적으로 문자열을 처리할 수 있다.


IS NULL: 경기도에 위치한 식품창고 목록 출력하기

  • Oracle
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, COALESCE(FREEZER_YN, 'N')
FROM FOOD_WAREHOUSE
WHERE REGEXP_LIKE(WAREHOUSE_NAME, '경기');
  • MS SQL Server
SELECT WAREHOUSE_ID, 
       WAREHOUSE_NAME, 
       ADDRESS, 
       COALESCE(FREEZER_YN, 'N') AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE WAREHOUSE_NAME LIKE '%경기%';
profile
헤매는 만큼 자기 땅이다.

0개의 댓글