PostgreSQL 8.4, ошибка TRIM - PullRequest
       14

PostgreSQL 8.4, ошибка TRIM

2 голосов
/ 27 июня 2010

У меня есть функция

CREATE OR REPLACE FUNCTION "public"."GetSoilCod" ( 
  "cod1" integer = 0, 
  "cod2" integer = 0, 
  "cod3" integer = 0, 
  "cod4" integer = 0, 
  "cod5" integer = 0, 
  "cod6" integer = 0, 
  "cod7" integer = 0 
) 
RETURNS varchar AS 
$body$ 
declare result varchar; 
BEGIN 
  result = cast($1 as varchar(2)) || '.' || 
                cast($2 as varchar(2)) || '.' || 
                cast($3 as varchar(2)) || '.' || 
                cast($4 as varchar(2)) || '.' || 
                cast($5 as varchar(2)) || '.' || 
                cast($6 as varchar(2)) || '.' || 
                cast($7 as varchar(2)); 
  return trim('.0' from result); 
END; 
$body$ 
LANGUAGE 'plpgsql' 
VOLATILE 
CALLED ON NULL INPUT 
SECURITY INVOKER 
COST 100; 

Когда я выполняю эту функцию и один или несколько кодов делятся на 10, результат этой функции неверный.

Примеры:

SELECT * FROM "public"."GetSoilCod"(10, 0, 0, 0, 0, 0, 0); 
return: 1 
expected: 10 


SELECT * FROM "public"."GetSoilCod"(10, 20, 0, 0, 0, 0, 0); 
return: 10.2 
expected: 10.20 

Почему обрезается последний 0 (ноль)?Я хочу обрезать только ".0" (точка ноль)

Если я выполню этот запрос:

SELECT * FROM "public"."GetSoilCod"(10, 20, 0, 0, 0, 0, 1); 
all its OK 
return & expected is: 10.20.0.0.0.0.1 

или:

SELECT * FROM "public"."GetSoilCod"(10, 20, 0, 0, 0, 1, 0); 

все в порядке.Возвращение и ожидание: 10.20.0.0.0.1

Где моя ошибка?

1 Ответ

3 голосов
/ 27 июня 2010

Trim не обрабатывает аргумент как одну строку для удаления, он обрабатывает его как неупорядоченный список символов, каждый из которых должен быть удален независимо от порядка, в котором они появляются с начала, конца или обоих.

Вызов trim('.0' from result); такой же, как trim('0.' from result);, и оба вызывают удаление всех 0 и . с конца строки.

SELECT trim('0.' from '100.00')
'1'

Попробуйте использовать regexp_replace вместо:

SELECT regexp_replace('100.0.2.0.0.0', '(\\.0)+$', '')
100.0.2
...