2012-06-25 13 views
5

Mam 7 wartości całkowitych (z odpowiednio 3,1,3,4,4,5,4 cyfr) i muszę połączyć je w jedną liczbę całkowitą (tj. 24-cyfrowy numer) . Starałem się zrobić jak tenconcat dwie wartości int w postgresql

create or replace function gen_id(int,int,int,int,int,int,int) returns bigint as $$ 
declare 
    id bigint; 
begin 
    id = $1 * 1000000000000000000000 + $2 * 100000000000000000000 + $3 * 100000000000000000 + $4 * 10000000000000 + $5 * 1000000000 + $6 * 10000 + $7; 
    return id; 
end; 
$$ language plpgsql; 

select * from gen_id(100,1,101,1000,1001,10001,1000); 

Ale kiedy go wykonać otrzymuję błąd: bigint poza zasięgiem. Czy istnieje inny lepszy sposób na zrobienie tego?
dzięki

+1

Przez "konkatenację" masz na myśli łączenie ciągów (po odpowiednim rzuceniu)? –

Odpowiedz

6

Co o:

SELECT CAST(CAST(num1 AS text)||CAST(num2 AS text)||... AS numeric(24,0)) 

Jeśli zdarzy ci się mieć swoje identyfikatory w jakiejś tabeli, a następnie można zrobić:

SELECT CAST(string_agg(CAST(num AS text), '') AS numeric(24,0)) FROM srctab; 
+0

problem polega na tym, że w mojej bazie danych identyfikator jest przechowywany jako numeryczny (24,0), więc nie mogę zaktualizować kolumny wartością ciągu znaków. Potrzebuję wartości liczbowej. Czy to możliwe? –

+1

@KumarRajput, po prostu prześlij wynik z powrotem do 'numeric (24,0)'. Zaktualizowano. – vyegorov

+2

+1. Ponadto, jako FYI (ponieważ używasz PostgreSQL), możesz wykonywać casting za pomocą nieco wygodniejszego operatora '::'. Innymi słowy, 'CAST (numer 1 AS tekst)' jest taki sam jak 'num1 :: text'. –

0

Jak mogę złączyć ciąg do liczby całkowitej

SELECT REPLACE(STR(ISNULL(MAX(usuarioid) + 1, 1), 6), ' ', '0') FROM usuarios 

usuarioid jest ciągiem + 1