IndexString : 문자열의 번호(숫자)를 반환한다.
*INSTR(대상문자열, 찾는문자열)
-> 값1에서 첫번째 값2를 찾아 위치하고 있는 인덱스숫자를 리턴한다. 결과는 3
EX)
SELECT INSTR('HELLO WORLD', 'L')
FROM DUAL;
EX)
SELECT INSTR('HELLO WORLD', 'k')
FROM DUAL;
값을 찾을 수 없는 경우 0으로 표시된다. 참고로 프로그래밍 언어에서는 -1로 표시된다.
*INSTR(대상문자열, 찾는문자열, 찾는시작위치)
EX)
SELECT INSTR('HELLO WORLD', 'L',5)
FROM DUAL;
->5번째부터 시작해서 L이 있는 위치하고 있는 숫자를 리턴한다. 결과는 10
*INSTR(대상문자열, 찾는문자열, 찾는시작위치, 몇번째)
EX)
SELECT INSTR('HELLO WORLD', 'L',1, 2)
FROM DUAL;
->첫번째부터 시작하는데 첫번째위치는 L위치가 3이지만 2번째 L을 찾아야 하므로 결과가 4가 된다.
*INSTR(대상문자열, 찾는문자열, 찾는시작위치, 몇번째)
EX)
SELECT INSTR('HELLO WORLD', 'L',-1, 2)
FROM DUAL;
마이너스가 붙으면 뒤에서 부터 앞으로 움직이는데 2번째 L을 찾아야 하므로 위의 결과랑 동일하게
4가 출력된다.
EX)
SELECT first_name
FROM EMPLOYEES
WHERE INSTR(UPPER(FIRST_NAME), 'A',2) = 2;
*like 사용없이 a가 2개 들어가고 1분기에 입사한 사원과 입사일을 구하시오.
SELECT FIRST_NAME,HIRE_DATE
FROM EMPLOYEES
where to_char(hire_date,'q')=1 --q는 Quarter약자
AND INSTR(UPPER(FIRST_NAME), 'A',1, 2) > 0;
대상문자열, 찾는문자열, 찾는시작위치, 몇번째
A의 첫번째 시작 위치가 어디에서 시작될지 모르지만 첫번째를 찾고 두번째
A가 나올때 까지 찾는데 0보다 커야 한다. 왼쪽부터 찾아야 하므로
*문자열 바꾸는 REPLACE함수
*REPLACE(문자열, '대상문자열', '바꿀문자열')
SELECT REPLACE('HELLO WORLD!!', 'L','R')
FROM DUAL;
SELECT REPLACE('HELLO WORLD!!', '!!','X')
FROM DUAL;
-공백제거
SELECT REPLACE('HELLO WORLD!!', ' ','')
FROM DUAL;
-왼쪽공백제거
SELECT LTRIM(' HELLO WORLD!! ')
FROM DUAL;
-오른쪽공백제거
SELECT RTRIM(' HELLO WORLD!! ')
FROM DUAL;
-양쪽의 공백을 지운다.
SELECT TRIM(' HELLO WORLD!! ')
FROM DUAL;
*fIrstname + lastname을 이용하여 EMAIL을 구하기
SELECT SUBSTR(FIRST_NAME,1,1)|| UPPER(REPLACE(LAST_NAME,' ', ''))
FROM EMPLOYEES;
*case
Select 컬럼명,,,,
case when 조건1 then 값1 : 조건1이 true이면 값1을 돌려준다.
...
else 값n : 그렇지 않으면 값n을 돌려준다.
end
when, then은 항상 한세트씩
EX) JOB이름이 PU CLERK를 찾아 만족하면 급여를 11% 인상하시오.
SELECT FIRST_NAME, JOB_ID, SALARY
CASE WHEN JOB_ID = 'PU CLERK'
THEN SALARY * 1.1 --11%인상
ELSE SALARY
END AS UP_SAL
FROM EMPLOYEES;
EX)
홀수월에 입사한 사원들의 급여를 30% 감봉하고
짝수월에 입사한 사원들의 급여를 30%인상하여
변경된 급여의 내림차순으로 사원들의 정보를 클릭하시오.
-출력 : 이름, 입사일, 급여, 변경급여
SELECT FIRST_NAME, HIRE_DATE,
CASE WHEN MOD(TO_CHAR(HIRE_DATE,'MM'),2 )= 1
THEN SALARY * 0.7
ELSE SALARY * 1.3
END AS POST_SALARY, SALARY
FROM EMPLOYEES
ORDER BY POST_SALARY DESC;
--반올림
-ROUND(값) : 값을 정수형으로 반올림한다.
-ROUND(값, 숫자) : 값을 숫자번째 자리까지 반올림한다.
ex)
SELECT ROUND(3.14159), ROUND(3.14159,2)
FROM DUAL;
만약에 3.54159였다면 결과는 4가됩니다.
--올림
--CEIL(값) : 값을 정수형으로 올림한다.
소수점은 신경쓰지 않음.
--내림
--FLOOR(값) : 값을 정수형으로 내림한다.
소수점아래는 없는것으로 치겠다.
Ex)
--80번 부서에 있는 사원들 중 급여가 9000 이하인 사원들의 급여를
50% 인상하고, 1500을 초과하는 사원들의 급여를 10% 삭감하여
80번 부서 사원정보를 출력하시오.
출력: 부서번호, 사원명, 급여, 변경급여
SELECT DEPARTMENT_ID, FIRST_NAME, SALARY,
CASE WHEN SALARY <= 9000
THEN SALARY * 1.5
ELSE SALARY * 0.9
END AS RE_SAL
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
;
Ex)
--80번 부서에 있는 사원들 중 급여가 9000 이하인 사원들의 급여를
50% 인상하고, 1500을 초과하는 사원들의 급여를 10% 삭감하여
전체 사원정보를 출력하시오.
출력: 부서번호, 사원명, 급여, 변경급여
SELECT DEPARTMENT_ID, FIRST_NAME, SALARY,
CASE WHEN DEPARTMENT_ID=80 AND SALARY <= 9000
THEN SALARY * 1.5
WHEN DEPARTMENT_ID=80 AND SALARY > 9000
THEN SALARY * 1.5
ELSE SALARY
END AS RE_SAL
FROM EMPLOYEES
;
*DECODE(값, 비교값1, 결과값, ..., 결과값n)
--값과 비교값1이 같다면 결과값1을 돌려준다.
--일치하는 것이 없으면 결과값N을 돌려준다.
SELECT FIRST_NAME, HIRE_DATE,
DECODE(TO_CHAR(HIRE_DATE, 'YY'), 01, '창립',
08, '마지막 입사', '중간입사') AS 구분
FROM EMPLOYEES;
--EX : 01년도에 입사한 사원을 창립으로 표현하고
--08년도에 입사한 사원을 마지막 입사로 표현하고
-- 그 외 사원을 중간 입사로 표현하시오.
--값과 비교값1이 같다면 결과값
--홀수분기에 입사한 사원의 급여를 10%감봉하고
--짝수분기에 입사한 사원의 급여를 20%인상하여
--사원 정보를 출력
--출력: 사원명, 입사일, 급여, 변경급여
SELECT FIRST_NAME, hire_date, Salary,
DECODE(MOD(To_char(HIRE_DATE, 'q'),2), 1, round(SALARY*0.9),round( SALARY*1.2) ) AS 변경급여
FROM EMPLOYEES
;
'프로그래밍 > DB' 카테고리의 다른 글
DB-180228 (491) | 2018.03.02 |
---|---|
DB-180227 (479) | 2018.03.02 |
180226 DB-4 (487) | 2018.02.27 |
180222 DB-2 (475) | 2018.02.22 |
2018221 DB-1 (475) | 2018.02.21 |