2015-07-15 3 views
1

Как я могу передать строку, содержащую двойное значение, в числовое значение, сохраняя точность. Если строка не является двойной, то конвертировать в нольЛистинг String to Double using Postgresql

+0

Что делает строку двойной? Является ли «1» двойным? Как насчет «1,0»? – user464502

+0

И «1», и «1.0» - это удвоения. –

+0

. Я отредактировал свой ответ, чтобы возвратить double, также если вход представляет собой строку, содержащую целое число. –

ответ

1

Этот запрос использует регулярное совпадение для возврата двойника, если входная строка имеет «числовой контент», а также цифры или десятичные числа с разделителем как 1.0, 18789.903. Возвращает 0, если строка ввода содержит символы с числами, такие как 10hghj. Символ минус перед строкой допускается (отрицательное двойное):

-- returns 1.2143 
WITH subquery AS (SELECT '1.2143'::text as value) 
    SELECT 
    CASE WHEN value ~ '^(-)?[0-9]+\.?([0-9]+)?$' 
     THEN value::double precision 
     ELSE 0 
    END FROM subquery; 

-- returns 0 because input is a contains not digits characters 
-- (the regex expression is the same) 
WITH subquery AS (SELECT '1214gh'::text as value) 
    SELECT 
    CASE WHEN value ~ '^(-)?[0-9]+\.?([0-9]+)?$' 
     THEN value::double precision 
     ELSE 0 
    END FROM subquery; 

Объяснение:

~ оператор соответствует регулярному выражению в PostgreSql. Больше информации здесь: http://www.postgresql.org/docs/9.4/static/functions-matching.html#FUNCTIONS-POSIX-TABLE

Выражение CASE WHEN THEN ELSE позволяет изменять возвращаемое значение в зависимости от одного или нескольких условий. В части WHEN разрешены все утверждения, которые возвращают логическое значение. Больше информации: http://www.postgresql.org/docs/9.4/static/functions-conditional.html

+0

Работает ли она на одном значении цифры, например '1'? –

+0

Спасибо, я исправил его. Теперь он работает с одной цифрой –