문제상황
목록 검색 쿼리를 짜야 한다.
검색조건에는 TYPE 컬럼과 NAME 컬럼이 있다.
사용자가 TYPE을 선택하면 해당 TYPE이 검색되게 하고,
추가로 TYPE 컬럼이 비어있는(NULL 또는 '') 행도 같이 검색되도록 하고 싶었다.
풀이
1. ISNULL 사용
먼저 빈 값이 검색되는 조건을 짜보자.
ISNULL은 이렇게 생겼다.
ISNULL(컬럼명, 바꿀 내용)
컬럼명은 NULL 여부를 확인할 컬럼이고,
컬럼이 NULL일 경우 바꿀 내용으로 내용이 바뀐다.
NULL이면 무조건 REPLACE 해준다고 보면 됨.
여기에 비교를 걸어준다.
ISNULL(컬럼명, 바꿀 내용) = 비교대상
위의 쿼리는 해당 컬럼의 NULL값을 바꿀 내용으로 바꿔서 결과값을 만든 후
그 결과로 나온 행들을 우항의 비교대상과 비교해서 같은 것들만 출력한다.
즉 아래처럼 쓸 수 있다.
ISNULL(TYPE, '') = ''
검색된 행의 TYPE 컬럼 값이 원래 빈 값이어도 비교대상과 같으니 출력되고,
NULL이면 빈 값으로 바뀐 후 비교대상과 비교되니 그 행도 출력될 것이다.
2. UNION ALL 사용
TYPE이 빈 값이거나 NULL인 행을 출력할 수 있으니
이제 TYPE이 사용자가 검색한 값인 행과 같이 출력되도록 해야 한다.
속도를 위해 UNION ALL을 쓰되 중복 행이 나오지 않게 해보자.
방법은 간단하다.
ISNULL(TYPE, '') != ''
SELECT문 1 : TYPE값에서 빈 값도 NULL도 아니고 사용자가 검색한 값일 때
SELECT문 2 : TYPE값이 빈 값이거나 NULL일 때
1,2번 셀렉트문을 UNION ALL 해준다.
xml 코드
SELECT CODE,
NAME,
TYPE,
RMK
FROM TBL_APPLE
WHERE ISNULL(TYPE,'') != ''
-- 아래 IF문은 필요없어 보이지만, 초기 화면 목록에 모든 데이터가 출력되도록 하기 위해 필요함
<if test="searchType != null and searchType != ''" >
AND TYPE = #{searchType}
</if>
UNION ALL
SELECT CODE,
NAME,
TYPE,
RMK
FROM TBL_APPLE
WHERE ISNULL(TYPE,'') = ''
'SQL' 카테고리의 다른 글
[Oracle/Tibero] 특정연도부터 올해까지의 목록 출력 (0) | 2020.07.23 |
---|---|
[Oracle/Tibero] 콤보에 '전체' 추가해서 기본값으로 세팅하기 (0) | 2020.07.23 |
[MSSQL] 검색 조건에 LIKE와 컬럼명을 이용하는 쿼리문 (0) | 2020.04.17 |
[SQLGate 오류] CREATE DATABASE가 실패했습니다. 나열된 일부 파일 이름을 만들 수 없습니다. (0) | 2020.03.23 |
[SQL] 페이징하기 : 페이지마다 특정 개수의 글목록 불러오는 쿼리 (0) | 2020.03.18 |
댓글