2013-10-07 72 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