[SQL] 다중 LIKE를 처리하는 IN과 REGEXP 표현


보호소에 들어올 당시(ANIMAL_INS 테이블)에는 중성화가 아니었지만(Intact)
보호소를 나갈 당시(ANIMAL_OUTS 테이블)에는 중성화된(Spayed, Neutered) 동물을 찾아야 한다.

SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
FROM ANIMAL_INS AS INS
    INNER JOIN ANIMAL_OUTS AS OUTS
    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.SEX_UPON_INTAKE LIKE 'Intact%'
AND (OUTS.SEX_UPON_OUTCOME LIKE 'Spayed%'
OR OUTS.SEX_UPON_OUTCOME LIKE 'Neutered%')

처음에는 이렇게 적었으나,
현실의 데이터베이스를 생각해보면 LIKE 조건이 많아질 경우도 있을 것이고,
나쁜 가독성과 코드의 비효율성을 동시에 가져올 수 있는 요인이 될 것이다.

그럴 때는 정규표현식을 사용하면 되는데, 프로그래밍 언어에서 전체적으로 통용되는 표현식이라서
알아두면 두고두고 쓸모있는 것 같다.(연습 필요!)

# 다중 LIKE 방지
SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
FROM ANIMAL_INS AS INS
    INNER JOIN ANIMAL_OUTS AS OUTS
    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.SEX_UPON_INTAKE LIKE 'Intact%'
AND OUTS.SEX_UPON_OUTCOME REGEXP 'Spayed|Neutered'
ORDER BY INS.ANIMAL_ID ASC

WHERE 절에 |로 OR조건을 만들어줘서, 두 문장을 한번에 처리할 수 있었다.

이 문제가 바로 다중 LIKE 문제인데,
처음엔 이런 식으로 작성했었으나 통과가 안되어서 이유를 계속 찾아보았다.

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME REGEXP 'Lucy|Ella|Pickle|Rogan|Sabrina|Mitty'
ORDER BY ANIMAL_ID

이유는 즉슨,
프로그래머스 상에서 잠깐 돌려보는 데이터와 정답체크용 데이터는 일단 다르고,
WHERE절에 정확한 일치 조건을 주기 위해서는 표현식을 단순히 or 조건으로 포함시키는( | ) 식으로 쓰면 안된다고 한다.

정규표현식의 ^과 $ 표현을 사용해서 시작과 끝을 지정해주는 작업이 필요하다고 한다.
(출처: https://programmers.co.kr/questions/7677)

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME REGEXP '^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$'
ORDER BY ANIMAL_ID

좋은 웹페이지 즐겨찾기