查询选择id是两位数还是三位数

时间:2017-09-19 18:05:32

标签: sql oracle

我正在尝试更新查询,如果st.style_perm_id是两位数则保留原样,如果三位数则显示三位数。

以下是我需要更新的部分

 SELECT
st.style_id
, decode(greatest(max(sd.sub_division_perm_id),99)
         , 99, to_number(LTRIM(TO_CHAR(max(sd.model_year), '9999'))
                         || LTRIM(TO_CHAR(max(sd.sub_division_perm_id), '09'))
                         || LTRIM(TO_CHAR(max(ymm.model_perm_id), '09'))
                         || LTRIM(TO_CHAR(max(st.style_perm_id), '09')))

         , null) hist_style_id
, 'w' || LTRIM(TO_CHAR(max(sd.model_year), '9999'))
   || 'k' || LTRIM(TO_CHAR(max(sd.sub_division_perm_id), '999'))
   || 'm' || LTRIM(TO_CHAR(max(ymm.model_perm_id), '999'))
   || 't' || LTRIM(TO_CHAR(max(st.style_perm_id), '999')) style_token
, max(sd.model_year) model_year

我尝试使用案例

  SELECT
st.style_id
, decode(greatest(max(sd.sub_division_perm_id),99)
         , 99, to_number(LTRIM(TO_CHAR(max(sd.model_year), '9999'))
                         || LTRIM(TO_CHAR(max(sd.sub_division_perm_id), '09'))
                         || LTRIM(TO_CHAR(max(ymm.model_perm_id), '09'))
                         || LTRIM(TO_CHAR(max(st.style_perm_id), '09'))
                         || CASE WHEN st.style_perm_id < 99 THEN LTRIM(TO_CHAR(max(st.style_perm_id), '99'))
                          WHEN st.style_perm_id < 999 THEN LTRIM(TO_CHAR(max(st.style_perm_id), '999')))
                        END

我收到如下错误。

  

ORA-00905:缺少关键字   00905. 00000 - &#34;缺少关键字&#34;

我不确定这是否是正确的做法。

如果st.style_perm_id是两位数,请如何更新查询,如果三位数则显示三位数。

感谢您的帮助,因为我正在敲打几个小时。

1 个答案:

答案 0 :(得分:0)

我不记得上次使用解码时的情况,并且不认为我曾在我的代码中使用过它,但是下面的小测试显示了案例表达和解码您的情况。

with st as ( 
    select 98 as style_perm_id from dual union all
    select 798 from dual
    )
select
  max(st.style_perm_id) MAXVALUE
, CASE WHEN max(st.style_perm_id) < 99 THEN ltrim(to_char(max(st.style_perm_id), '99')) 
       WHEN max(st.style_perm_id) < 999 THEN ltrim(to_char(max(st.style_perm_id), '999')) 
       ELSE ' ' 
       END   BY_CASE   
, DECODE(sign(999-max(st.style_perm_id)), 1,ltrim(to_char(max(st.style_perm_id), '999')),
  DECODE(sign(99-max(st.style_perm_id)), 1,ltrim(to_char(max(st.style_perm_id), '99'))),' ')   BY_DECODE
from st

I used an asktom discussion协助解码,这是符号(...)的来源