Case 구문으로 하기와 같이 씁니다.
CASE WHEN alarm_message = 0 THEN 'Empty' WHEN alarm_message between 1 and 10 THEN '1~10' WHEN alarm_message between 11 and 20 THEN '11~20' ........................ WHEN alarm_message between 991 and 1000 THEN '991~1000' 이렇게 10개씩 계속 더해져서 1000까지 순환 구문으로 작성하는 코드가 궁금합니다. 여기에 WHEN alarm_message in ('100','200','300','500','400','30','50','180','150','90','60','125','250','120','600','20','360','270','800','1000','140','40','240','450','700','170','350','130','230','260','80') THEN 'filling error' 상기 번호들은 위의 순환 구문에 서 제외하여 filling error' 라고 기입되어야 합니다.
WITH t AS ( SELECT LEVEL - 1 alarm_message FROM dual CONNECT BY LEVEL <= 1001 ) SELECT alarm_message , CASE WHEN alarm_message = 0 THEN 'Empty' WHEN alarm_message IN (100,200,300,500,400,30,50,180,150,90,60 ,125,250,120,600,20,360,270,800,1000,140 ,40,240,450,700,170,350,130,230,260,80) THEN 'filling error' ELSE (CEIL(alarm_message / 10) * 10 - 9) || '~' || (CEIL(alarm_message / 10) * 10) END x FROM t ;
제가 활용한 구문은 하기와 같습니다.
적용하는 동안 문자/ 숫자 변경 에러가 발생하여 cast와 convert로 변경하였습니다. 이래저래 머리를 굴렸는데, 아래 구문 확인 부탁 드립니다.
Arithmetic overflow error converting nvarchar to data type numeric. 에러가 뜨네요...
Select ALARM_MESSAGE , CASE WHEN ALARM_MESSAGE = 0 THEN 'Empty' WHEN ALARM_MESSAGE in ('100','200','300','500','400','30','50','180','150','90' ,'60','125','250','120','600','20','360','270','800','1000','140', '40','240','450','700','170','350','130','230','260','80') THEN 'filling error' Else CAST(CEILing(CAST(ALARM_MESSAGE/(1*1.0) as decimal(16,1))/10) *10-9 as varchar) + '~' + CAST(CEILing(CAST(ALARM_MESSAGE/(1*1.0) as decimal(16,1))/10) *10 as varchar) + ' Jam' END as status FROM T
DBMS 종류를 명시하지 않았네요?
오라클을 기준으로 답변 드렸습니다.
WITH 구문은 테스트 샘플을 만든거구요. (0 부터 1000 까지 숫자 만든 것입니다.)
alarm_message 의 자료형이 뭔가요? 숫자인가요? 문자인가요?
조건절과 계산식에서 숫자와 문자를 혼용하여 사용하고 있네요?
숫자면 숫자, 문자면 문자 한가지로 통일해야 합니다.
숫자라고 가정하고 풀어보겠습니다.
-- MSSQL -- SELECT alarm_message , CASE WHEN alarm_message = 0 THEN 'Empty' WHEN alarm_message IN (100,200,300,500,400,30,50,180,150,90,60 ,125,250,120,600,20,360,270,800,1000,140 ,40,240,450,700,170,350,130,230,260,80) THEN 'filling error' ELSE CONCAT( (CEILING(alarm_message / 10.) * 10 - 9), '~' , (CEILING(alarm_message / 10.) * 10 ), ' Jam' ) END status FROM t ;
애초에 추출할 때 cast 를 이용해 숫자로 변경하세요.
에러가 난다면 에러 원인을 찾아보세요.
혹시 숫자가 아닌 자료가 나오지는 않는지?
SELECT x , CASE WHEN x = 0 THEN 'Empty' WHEN x IN (100,200,300,500,400,30,50,180,150,90,60 ,125,250,120,600,20,360,270,800,1000,140 ,40,240,450,700,170,350,130,230,260,80) THEN 'filling error' ELSE CONCAT( (CEILING(x / 10.) * 10 - 9), '~' , (CEILING(x / 10.) * 10 ), ' Jam' ) END status FROM (SELECT CAST( SUBSTRING(alarm_message, CHARINDEX('Qty:', alarm_message) + 4 , CHARINDEX('CBN' , alarm_message) - CHARINDEX('Qty:', alarm_message) - 6 ) AS NUMERIC) x FROM t ) a ;