[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
Author And Source
이 문제에 관하여([SQL] 다중 LIKE를 처리하는 IN과 REGEXP 표현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cyanred9/SQL-다중-LIKE를-처리하는-IN과-REGEXP-표현저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)