2016-02-22 3 views
2

У меня есть следующие диапазоны цен для строк: $0-$50, $50-$100, $100-$500, $500+ определяется как столбец varchar2. Я хотел бы сортировать строки со значениями в указанном выше порядке. может ли кто-нибудь предложить мне идею сделать это.сортировать по диапазону цен в запросе оракула

+0

Можете ли вы предоставить, что вы пробовали? –

+0

Я не понял, с чего начать и как .. – user525146

+0

Просьба представить структуру таблицы, данные образца и желаемые результаты. Угадав, что вы хотите «заказать» с помощью инструкции 'case'. – sgeddes

ответ

2

Вы можете делать то, что хотите, используя regexp_substr(). Однако case вероятно проще всего:

order by (case pricerange 
      when '$0-$50' then 1 
      when '$50-$100' then 2 
      when '$100-$500' then 3 
      when '$500+' then 4 
      else 999 
      end) 
+0

как сделать заказ desc если я использую случай? – user525146

+0

Просто добавьте 'desc' после выражения:' end> ​​desc'. –

+0

Могу ли я использовать 'decode' и' regexp_substr() 'в порядке, как это? 'order by decode (sign (regexp_substr ('1 asc nulls last', '^ (\ d) *') - 7), '-1', '1 asc nulls last', (case pricerange , когда '$ 0- $ 50 'затем 1 , когда «$ 50- $ 100», затем 2 , когда «$ 100- $ 500», затем 3 , когда «$ 500 +», затем 4 еще 999 конец)) 'потому что он не работает для меня, сортировка не работает на этом query – user525146

0

Может быть, вы принимаете во внимание то, как это. WIDTH_BUCKET(exp, min,max,buckets_cnt). Функция присваивает exp свой ведро. И он создает buckets_cnt + 2 В следующем примере создается 5 ведер WIDTH_BUCKET(price,50,500,3).

(500-50)/3 = 150 
0 - <50 less than min 
1 - (50 : 200) 
2 - (200 : 350) 
3 - (350 : 500) 
4 - 500> more than max 



with prod_table as(select 'A' prod_name, 49 price from dual 
        union all 
        select 'B' prod_name, 100 price from dual 
        union all 
        select 'c' prod_name, 200 price from dual 
         union all 
        select 'd' prod_name, 300 price from dual 
         union all 
        select 'e' prod_name, 1000 price from dual) 
SELECT prod_name, price,WIDTH_BUCKET(price,50,500,3) from prod_table order by WIDTH_BUCKET(price,50,500,3) desc 
Смежные вопросы