Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 проблемы использования decode  [new]
Bidgo
Member

Откуда:
Сообщений: 20
есть 2 таблицы:
1. docs
tin    name   cod_doc
11 Petya 172511
17 Vasya 135621
35 Kolya 121211
2. data
cod_doc  rowc     zn
172511 R0001A 12.00
172511 R00102A 13.50
172511 R03A 14.50
172511 R0001B 145.00
172511 R0002B 55.00
135621 R01A 200.00
121211 R0001A 1.10
121211 R0001B 21.10
121211 R0001C 12.10
121211 R0001D 17.10

И есть запрос:
SELECT b.tin, b.name
,nvl(sum(decode(rowc,'R%A',a.zn)),0) as "RA"
,nvl(sum(decode(rowc,'R0001B',a.zn)),0) as "RB"
FROM data a, docs b
where a.cod_doc=b.cod_doc
and b.tin<30
group by tin,name

Проблема в том, что data.rowc разной длины.
Выбирает, только если указать nvl(sum(decode(rowc,'R0001A',a.zn)),0) as "RA" и т.п.
Можно ли сделать так, чтобы в запросе "RA" выбирало все значения, начинающиеся на R и заканчивающиеся на А.
25 апр 13, 20:42    [14232104]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
Прямо на форуме написал, если между р и а только цифры то тогда :
nvl(sum(decode(regexp_replace(rowc,'[[:digit:]]+'),'RA',a.zn)),0)
25 апр 13, 21:13    [14232166]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
MazoHist
Guest
case when rowc like 'R%A' then a.zn else null end
25 апр 13, 21:19    [14232178]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
123йй
Member

Откуда:
Сообщений: 1637
MazoHist,

else null
а это нафига ?
26 апр 13, 08:09    [14233160]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Bidgo
Member

Откуда:
Сообщений: 20
Ramin Hashimzade,

Спасибо, это подходит
nvl(sum(decode(regexp_replace(rowc,'[[:digit:]]+'),'RA',a.zn)),0)

но есть данные, где rowc имеет вид T1R%G1, где %-числа от 1 до 100000, то есть известно начало и конец.
Подскажите, как правильно составить выражение regexp?
26 апр 13, 08:30    [14233197]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Bidgo
Member

Откуда:
Сообщений: 20
Прокатит ли такое выражение?
nvl(sum(decode(regexp_replace(rowc, '^T1R([[:digit:]]+)G1$'),'T1RG1',a.zn)),0)

И еще, как написать правильно, если данные имеют вид '^T1R%G1' ?
26 апр 13, 08:59    [14233288]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
sworn
Member

Откуда: Point of no return
Сообщений: 127
Bidgo,

автор
где rowc имеет вид T1R%G1, где %-числа от 1 до 100000

заготовка...
nvl(sum(decode(sign(100001 - to_number(regexp_replace(s, '.*R(\d+)[A-Z].*', '\1'))), 1, a.zn)), 0) as "RX"
26 апр 13, 09:09    [14233338]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Bidgo
Member

Откуда:
Сообщений: 20
... подкрался незаметно :(

Используется Oracle 9i, функций regexp_ нету
26 апр 13, 11:30    [14234161]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Для 9i
Guest
Bidgo
... подкрался незаметно :(

Используется Oracle 9i, функций regexp_ нету

with a as (
  select 'R123A'      rowc from dual union all
  select 'T1R01234G1' rowc from dual 
)
select
  a.*,
  case when rowc like 'T1R_%G1' 
            -- 4 = length('T1R')+1;  5 = length('T1R')+length('G1')
        and rtrim(substr(rowc,4,length(rowc)-5),'0123456789') is null 
       then 'Yes' 
       end Match
from a
26 апр 13, 11:59    [14234338]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Для 9i
Guest
Для 9i,

Если быть более точным
Bidgo
имеет вид T1R%G1, где %-числа от 1 до 100000)
то
with a as (
  select 'R123A'      rowc from dual union all
  select 'T1R1000000G1' rowc from dual 
)
select a.*,
case
when rowc like 'T1R_%G1' 
  -- 12 = length('T1R')+length('G1')+length('1000000')
  and length(rowc)<=12
  -- 4 = length('T1R')+1;  5 = length('T1R')+length('G1');
  and rtrim(substr(rowc,4,length(rowc)-5),'0123456789') is null 
  and lpad (substr(rowc,4,length(rowc)-5),7,'0') between '0000001' and '1000000'
then 'Match' 
end Match
from a


Многовато написано (
26 апр 13, 12:15    [14234448]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Bidgo
Member

Откуда:
Сообщений: 20
Для 9i,

Многовато, и єто будет трудновато запихнуть в запрос
nvl(sum(decode(rowc,'^T1R%G1',a.zn)),0)
26 апр 13, 12:41    [14234567]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 754
Bidgo
Можно ли сделать так, чтобы в запросе "RA" выбирало все значения, начинающиеся на R и заканчивающиеся на А.

SELECT b.tin, b.name
,nvl(sum(decode(substr(rowc, 1,1)||substr(rowc,-1,1),'RA',a.zn)),0) as "RA"
  FROM data a, docs b
  where   a.cod_doc=b.cod_doc
  and b.tin<30
group by tin,name
26 апр 13, 12:42    [14234574]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Для 9i
Guest
Bidgo
Для 9i,

Многовато, и єто будет трудновато запихнуть в запрос
nvl(sum(decode(rowc,'^T1R%G1',a.zn)),0)


Можно, конечно, написать собственячую функцию для выдергивания числа по маске. Запись запроса станет короче и нагляднее, но работать это будет дольше. Тут уж сами решайте.
26 апр 13, 12:52    [14234637]     Ответить | Цитировать Сообщить модератору
 Re: проблемы использования decode  [new]
Bidgo
Member

Откуда:
Сообщений: 20
Павел Лузанов
SELECT b.tin, b.name
,nvl(sum(decode(substr(rowc, 1,1)||substr(rowc,-1,1),'RA',a.zn)),0) as "RA"
  FROM data a, docs b
  where   a.cod_doc=b.cod_doc
  and b.tin<30
group by tin,name


То что надо! Получилось. Всем спасибо.
26 апр 13, 13:18    [14234828]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить