https://programmers.co.kr/learn/courses/30/lessons/59046
너무 쉬운 문제여서 한 번에 정답이긴 했지만, 어떤분이 정규식으로 찾는 걸 보았다!
생각 못했던 부분이라 짚고 넘어가는 걸로!!
정규식 함수
=> 표준 구문 규칙을 사용하여 문자열 데이터의 간단한 패턴 및 복잡한 패턴을 검색하고 조작할 수 있으며,
자연어 처리에 큰 효율을 발휘하는 함수임! 즉 문자열 데이터에서 큰 힘을 발휘하는 함수임. 물론 LIKE 라는 함수도 있
지만 정규식을 이용하면 더 다양하고 상세한 결과값을 사용할 수 있음.!!
함수 | 설명 |
REGEXP_LIKE | LIKE 연산자와 유사하지만 간단한 조건 대신 정규식 일치를 수행함 |
REGEXP_REPLACE | 정규식 패턴을 검색하여 대체 문자열로 바꿈 |
REGEXP_INSTR | 정규식 패턴에 대해 문자열을 검색하고 일치하는 위치를 반환 |
REGEXP_SUBSTR | 지정된 문자열 내에서 정규식 패턴을 검색하고 일치하는 부분 문자열을 추출 |
REGEXP_COUNT | 입력 문자열에서 패턴일치가 발견되는 횟수 반환 |
기본 함수의 본질은 같으나 정규식으로 조건을 건다는 것이 다른듯 하다.
ex) 이름에 'AR' 'N' 이 들어간 학생의 이름을 출력하라
1. 보통 일반 함수 LIKE를 사용했을 때
select name
from table
where name like ('%ar%') or ('%n%')
2. 정규식 함수를 사용했을 때
select name
from table
where regexp_like (name, '(ar|n)')
그렇다면 어떤분이 제기하신 코드를 봐보자!
SELECT ANIMALID, NAME, SEXUPONINTAKE
FROM ANIMALINS
WHERE NAME REGEXP 'Lucy|Ella|Pickle|Rogan|Sabrina|Mitty'
ORDER BY ANIMAL_ID
앞서 본 것처럼 정답일 것 같지만 오답이 나온다.
REGEXP 는 문자열 내부에 어떤 부분이든 해당 정규식이 존재하면 True 이기 때문이다.
즉 hiLucy 라는 이름의 동물이 있다면, 안에 Lucy 라는 이름이 있기때문에 통과를 해버린다!
이걸 바르게 고쳐보자.
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME regexp "^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$"
ORDER BY ANIMAL_ID
이렇게 메타문자(^, $) 를 설정해서 처음과 끝을 지정해줘야한다.
'프로그래밍 언어 > SQL' 카테고리의 다른 글
[Hackerrank] Weather Observation Station 5 (0) | 2022.01.13 |
---|---|
[Hackerrank] Print Prime Numbers 풀이 (MySQL) (0) | 2022.01.13 |
[프로그래머스 SQL 문제] 보호소에서 중성화한 동물 (0) | 2021.08.10 |
[프로그래머스 SQL 문제] 오랜 기간 보호한 동물(1) (0) | 2021.08.10 |
[프로그래머스 SQL 문제] 입양 시각 구하기(2) (0) | 2021.08.05 |