순환구문 활용 / 예외 구문 삽입 0 7 2,449

by 갈매기 [SQL Query] [2018.03.29 01:59:16]


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' 라고 기입되어야 합니다. 

 

by 마농 [2018.03.29 08:28:02]
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
;

 


by 갈매기 [2018.04.02 23:22:20]

마농님 감사합니다.  LEVEL과  Else 구문 간단한 설명 부탁 드려 봅니다. 

select -1 alarm_message 부터 이해가 안되네요. ㅠㅠ

 

alarm_message가 2일 경우,

/10을 해서 0.2 로 계산이 되고 그 후에 ceiling으로 1로 치환해야 하는데, 제 컴퓨터에서는 0.2를 0으로 계산하여 ceiling 후에 0으로 치환됩니다. 어떻게하면 되나요? 

찾아보니 cast(2/(1*1.0) as decimal(16,1))

이런식으로 하라는데, 뭔가 어색합니다. 

 

 


by 갈매기 [2018.04.03 02:08:46]

제가 활용한 구문은 하기와 같습니다. 

적용하는 동안 문자/ 숫자 변경 에러가 발생하여 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

 


by 마농 [2018.04.03 07:55:20]

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
;

 


by 갈매기 [2018.04.03 22:16:50]

문자형(nvarchar(max))입니다. 실제로 alarm_message에서 일정 숫자 부분만 추출하는 형식입니다. 하기는 실제 구문입니다. 

Substring(alarm_message,CHARINDEX('Qty:', alarm_message)+4,CHARINDEX('CBN', alarm_message)-CHARINDEX('Qty:', alarm_message)-6)

 


by 마농 [2018.04.04 10:12:37]

애초에 추출할 때 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
;

 


by 갈매기 [2018.04.04 22:40:09]

감사합니다. 마농님. 알려주신데로 미리 numeric으로 변경하여 처리 하였습니다. 에러가 발생되지 않습니다. 감사합니다. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입