Adam Woźniak

Adam Woźniak software architect
and developer

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Witam

Dziś kolega rzucił zagwozdką: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2 (bez użycia własnej pomocniczej funkcji, a używając (ewentualnie) prostych funkcji dostępnych w SQL/Oracle)?

Przykład:
Mamy "x1x2x3". Suma: 6.

Wygooglałem jedno rozwiązanie tej zagadki, ale ciekaw jestem Waszych pomysłów, może bardziej zwięzłych, niż to co wyszukałem :)

Pozdrawiam, Adam Woźniak
Łukasz Filut

Łukasz Filut ostatnio mistrz
młyna, tak po prostu

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

niestety w Oracle to nie wiem ale w PostgreSQL zrobiłbym to tak:

select sum(arr[1]::int) from (
select regexp_matches('1x2x3-13','([0-9]+)','g') as arr
) as xx;

zsumuje wszystkie liczby w danym ciągu :).Łukasz Filut edytował(a) ten post dnia 17.03.10 o godzinie 00:18
Krzysztof Bielecki

Krzysztof Bielecki Senior consultant,
Capgemini Polska

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

select sum(substr('4519',rownum,1))
from dual connect by level <= length('4519');

No w oracle tez sie da ;)
A ogolnie najprosciej to poprstu napisac funkcje co sumuje :)

konto usunięte

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Pójdźmy troszkę dalej. Zsumujmy liczby, a nie cyfry. Moje 3 grosze:

SELECT SUM(TO_NUMBER(token)) sum_numbers
FROM (
SELECT TRIM (SUBSTR (txt,
INSTR (txt, ',', 1, LEVEL) + 1,
INSTR (txt, ',', 1, LEVEL + 1) - INSTR (txt, ',', 1, LEVEL) - 1
)
) AS token
FROM (SELECT ',' || translate(t,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,')|| ',' txt
FROM (select '1asdasd11ss22sdd45' t from dual))
CONNECT BY LEVEL <= LENGTH (txt) - LENGTH (REPLACE (txt, ',', ''))
) WHERE token IS NOT NULL

mozna jeszcze prosciej i usunąć translate:

SELECT SUM(TO_NUMBER(token)) sum_numbers
FROM (
SELECT TRIM (SUBSTR (txt,
INSTR (txt, ',', 1, LEVEL) + 1,
INSTR (txt, ',', 1, LEVEL + 1) - INSTR (txt, ',', 1, LEVEL) - 1
)
) AS token
FROM (SELECT ',' || REGEXP_REPLACE(t, '[[:alpha:]]', ',') || ',' txt
FROM (select '1asdasd11ss22sdd45' t from dual))
CONNECT BY LEVEL <= LENGTH (txt) - LENGTH (REPLACE (txt, ',', ''))
) WHERE token IS NOT NULL
/Robert Zapadka edytował(a) ten post dnia 18.03.10 o godzinie 13:30

konto usunięte

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Najprościej to chyba będzie coś pomiędzy powyższymi rozwiązaniami ;)


select
sum(substr(t, rownum, 1))
from
(select
regexp_replace('dsf232sdfs42', '[^[:digit:]]') as t
from dual)
connect by level <= length(t);
Ireneusz Ptak edytował(a) ten post dnia 20.03.10 o godzinie 01:39

konto usunięte

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

W MS SQL zrobiłbym tak:

declare @expr varchar(max) = '1*2*3'
exec ('select '+ @expr)

nie ma pod ręką klienta Oracle ale myślę że coś jak:

EXECUTE IMMEDIATE 'select '|| @expr || 'from dual

też by dało radę
Krzysztof Bielecki

Krzysztof Bielecki Senior consultant,
Capgemini Polska

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

a execute immediate jest ;> w sql :D
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Krzysztof Drelczuk:
W MS SQL zrobiłbym tak:

declare @expr varchar(max) = '1*2*3'
exec ('select '+ @expr)

Zapuscilem google i nie moge sie nadziwic jak bardzo ludzie mecza sie z tym problemem. Np. zeby policzyc sume liczb w ciagu '1,2,13,44,55' konstruuja jakies pietrowe procedury wyciagajace kazda liczbe po kolei zamiast po prostu dac

REPLACE('1,2,13,44,55',',','+')

do zmiennej a potem tak jak Krzysztof napisal. Inna sprawa, ze nie mam pojecia jak zrobic to jednym zapytaniem MSSQL.Bartosz Ślepowronski edytował(a) ten post dnia 01.04.10 o godzinie 18:55

konto usunięte

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Bartosz Ślepowronski:
Zapuscilem google i nie moge sie nadziwic jak bardzo ludzie mecza sie z tym problemem. Np. zeby policzyc sume liczb w ciagu '1,2,13,44,55' konstruuja jakies pietrowe procedury wyciagajace kazda liczbe po kolei zamiast po prostu dac

REPLACE('1,2,13,44,55',',','+')

do zmiennej a potem tak jak Krzysztof napisal. Inna sprawa, ze nie mam pojecia jak zrobic to jednym zapytaniem MSSQL.

Hmmmm... umiejetnosc czytania ze zrozumieniem w narodzie zamiera: po pierwsze - chodzilo o policzenie sumy cyfr, po drugie - w polu tekstowym, a to nie jest to samo, co liczby porozdzielane pojedynczymi przecinkami, samymi literami, czy w postaci gotowego wyrazenia, a po trzecie - mialo byc ladnie, a takim konstrukcjom z replace, czy translate to daleko do tego ;)
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Ireneusz Ptak:
Hmmmm... umiejetnosc czytania ze zrozumieniem w narodzie zamiera

Chyba faktycznie, bo przeczytalem twojego posta trzy razy i ciagle nie rozumiem co chciales przekazac i jak to sie ma do tego co napisalem..

konto usunięte

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Dasz rade.

Przeczytaj najpierw, o co pytal autor watku, a pozniej dopasuj punkty z mojego posta do poszczegolnych propozycji rowiazania.

Podpowiedz: do Twojego posta odnosi sie fragment "a po trzecie(...)"
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Ireneusz Ptak:
Podpowiedz: do Twojego posta odnosi sie fragment "a po trzecie(...)"

Bo oczywiscie kazdy woli naklepac 100 linii ladnego kodu zamiast jednej linii brzydkiego - to skutki studiowania na polibudzie ;)Bartosz Ślepowronski edytował(a) ten post dnia 02.04.10 o godzinie 10:51

konto usunięte

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Panowie chodzi o czystego SQL bez wstawek Transact-SQL, lub PL/SQL. Wasze rozwiązania są ciekawe. Zapisałem sobie je do mojej "biblioteczki rozwiązań"
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Robert Zapadka:
Panowie chodzi o czystego SQL bez wstawek Transact-SQL, lub PL/SQL.

W czystym SQL sie tego nie da zrobic - chyba ze inaczej rozumiemy "czysty SQL". W kazdym z podanych rozwiazan uzyte sa funkcje specyficzne dla danej DB i wiec zadne nie jest "czyste" i miedzysystemowe.

Jak napisalem wczesniej - nie wiem jak to zrobic jednym zapytaniem w TSQL czekam z niecierpliwoscia az ktos podrzuci rozwiazanie.
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Bartosz Ślepowronski:
Ireneusz Ptak:
Podpowiedz: do Twojego posta odnosi sie fragment "a po trzecie(...)"

Bo oczywiscie kazdy woli naklepac 100 linii ladnego kodu zamiast jednej linii brzydkiego - to skutki studiowania na polibudzie ;)Bartosz Ślepowronski edytował(a) ten post dnia 02.04.10 o godzinie 10:51

No nie, Panowie i Panie (są tu?), to nie tak. Kod jest nie tylko dla nas, ale i dla tych, którzy będą go w przyszłości utrzymywać, serwisować i (być może) modyfikować. Kod więc powinien być możliwie ładny - oczywiście nie takim kosztem, o jakim pisze Bartek (100:1), ale po prostu nawyk porządnego pisania trzeba w sobie wyrobić. Czasem jedna...dwie linijki więcej (przy kilkudziesięciu w sumie) potrafią znakomicie poprawić czytelność kodu.
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Czasem czytelnosc kodu osiaga sie przez dodanie paru linii a czasem przez ich wyrzucenie.

Nasze dygresje odbiegaja coraz dalej od tematu - a ja bym naprawde chcial zobaczyc rozwiazanie dzialajace pod MSSQL albo przynajmniej jakiegos hinta dostac :)

PS: Tak, Panie tez tu sa :)Bartosz Ślepowronski edytował(a) ten post dnia 02.04.10 o godzinie 13:19
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Bartosz Ślepowronski:
Czasem czytelnosc kodu osiaga sie przez dodanie paru linii a czasem przez ich wyrzucenie.
Oczywiście. Po prostu odniosłem się konkretnie do Twojej wypowiedzi.
Nasze dygresje odbiegaja coraz dalej od tematu
Racja.
Mirosław Serwaczyński

Mirosław Serwaczyński Analityk programista

Temat: zagadka: jak zsumować cyfry w kolumnie typu TEXT/VARCHAR2?

Jeżeli rozwiązanie nie musi być "jednozapytaniowe", to w MSSQL można np. tak:

declare @wart varchar(100), @sum int
set @wart='1a2a3cccc456eeee111'
set @sum=0

while LEN(@wart)>0
begin
if CHARINDEX(LEFT(@wart,1),'123456789')>0
set @sum=@sum+CAST(left(@wart,1) as int)
set @wart=RIGHT(@wart,len(@wart)-1)
endMirosław Serwaczyński edytował(a) ten post dnia 09.04.10 o godzinie 20:16



Wyślij zaproszenie do