2013-10-07 104 views
1

我在postgresql中有一個衣服尺寸列,其中包含(24,25,「S」,「M」,「ONESIZE」,「XL」)等值。Postgresql varchar to int

我需要從中只提取整數值並將結果轉換爲int。 我試圖以下面的格式編號,如果該行包含一個數字,那麼該函數會起作用,但如果它只包含字母則不起作用。

select to_number('aq1', '99999D9') -> 1 
select to_number('23', '99999D9') -> 23 
select to_number('ONESIZE', '99999D9') -> error 

我需要一個函數,它的工作方式可以讓我在varchar列上加入一個int列。

select ???func("XL") -> null/0 
select ???func(23) -> 23 

任何幫助,將不勝感激

+0

如果你需要在int上加入varchar(這很糟糕,請儘量避免這種情況),爲什麼不把int轉換爲varchar,然後再加入呢? –

+0

好點,但我確實需要以後使用這些數字,我需要一個我們都可以學習的通用解決方案。通過你的方法一個通用的解決方案是在varchar和int中有一個數字表,然後通過它連接。 – AdrianBR

+0

數據源是第三方,不可避免的 – AdrianBR

回答

0

我只是找到了一種方法,雖然它看起來並不很整齊。也許有人知道一個本地功能?

select to_number(concat('ONESIZE',0), '99999D9')/10 -> 0 
select to_number(concat('23',0), '99999D9')/10 -> 23 

按cathulhu的建議,與領先的0 concating避免分裂

select to_number(concat(0,'23'), '99999D9') -> 23 
1

試試這個:

select COALESCE((select UNNEST(regexp_matches('XLds', '\d+')::integer[])), 0); 

注意,這個正則表達式中的字符串只有第一個號碼相匹配。

+0

匹配第一個數就足夠了這種情況。方面(可讀性和可維護性)明智,它不... ...漂亮。有關速度的任何想法與另一個答案中的想法? – AdrianBR

+1

你也可以使用你自己的想法,但爲什麼你不用領導0連接?那麼你不必除以10:select to_number(concat(0,'aq1'),'99999D9') – cathulhu

+0

你是對的,很乾淨:) – AdrianBR