728x90
발단
외래키로 존재하는 값이 달라지지 않는다고 가정하고, 우리는 DB 를 설계할 때 종종 조회를 위해 외래키를 csv 형태로 가지는 field 를 설계한다. 이런 상황에서 조회할 때 사용하면 좋은 내장함수를 발견하게 되었다.
설명
- 만약 csv 형태로 값을 저장하는게 아니라면 field 에 특정구조를 가지게 한다.
- 예를들면 prefix, suffix 로 `|` 를 사용하는 것이다. 1,2,3 -> |1|2|3| 으로 저장하여 3을 조회하고 싶을 때 |3| 을 조회하면 된다.
- 위와 같은 구조도 상황에 따라서 사용하면 되지만, 처음에 csv 형태로 값을 저장하기로 하였기에 구조를 변경하고 싶지 않았다.
- 따라서, FIND_IN_SET 을 통해 문제를 해결하였다.
해결
- FIND_IN_SET 은 두개의 파라미터를 받는다.
- 첫번째 파라미터는 `패턴`으로 찾으려는 값이다.
- 두번째 파라미터는 `strlist`으로 타겟이 되는 csv 형태의 값이다.
- `strlist` 에 해당되는 속하는 값중 하나를 `패턴`에 넣게되면 position 을 응답하게 된다.(position 은 `index + 1` 이다.)
코드
-- 기본적인 예제이다.
SELECT FIND_IN_SET('1', '1,2,3')
-> 1
---------------------------------------------
-- 아래처럼 서브쿼리로 사용할 수 있다.
SELECT FIND_IN_SET('1',
(
SELECT something_csv FROM atsky
)
)
---------------------------------------------
-- 아래처럼 조건문으로 처리할 수 있다.
SELECT * FROM atsky
WHERE 0 < FIND_IN_SET('1', something_csv)
특이사항
- 만약 첫번째 파라미터가 두번째 파라미터에 포함되지 않거나, 두번째 파라미터가 empty string 이라면 0을 반환한다.
- 파라미터중 하나라도 null 이면 null 을 반환한다.
- 만약 첫번째 파라미터가 `,` 을 포함하고 있다면 정확한 값을 반환하지 않는다.
출처
728x90
'DB > MariaDB' 카테고리의 다른 글
[MariaDB] TIME_TO_SEC 내장함수를 사용해서 TIME 형식의 string 값을 초로 변경해보자 (0) | 2023.05.16 |
---|---|
[MariaDB] STR_TO_DATE 내장함수를 사용해서 string 을 DATETIME 으로 변환하자.(feat. 사용예시) (0) | 2023.05.16 |