2013-10-07 8 views
1

У меня есть столбец размера одежды в postgresql, содержащий такие значения, как (24, 25, "S", "M", "ONESIZE", "XL").Postgresql varchar to int

Мне нужно извлечь из него только целочисленные значения и преобразовать результат в int. Я попробовал to_number в следующем формате, который работает, если строка содержит число, но не работает, если она содержит только буквы.

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

Если вам нужно присоединиться к varchar по int (что плохо, постарайтесь избежать этого), почему бы вам не включить 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, в concating с ведущими 0, чтобы избежать Деления

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

Попробуйте это:

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

Обратите внимание, что это регулярное выражение соответствует только первому номеру в строке.

+0

, соответствующий первому числу, достаточно для этого случая. Аспект (читаемость и ремонтопригодность) мудрый, это ... не очень. Любая идея о скорости по сравнению с другой в другом ответе? – AdrianBR

+1

Вы также можете использовать свою собственную идею, но почему бы вам не согласиться с ведущими 0? Тогда вам не нужно делиться на 10: выберите to_number (concat (0, 'aq1'), '99999D9') – cathulhu

+0

вы правы, намного чище :) – AdrianBR