2

機能があります

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; 

この関数を実行して、1つ以上のコードを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

私の間違いはどこにありますか?

4

1 に答える 1

3

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
于 2010-06-27T19:39:33.013 に答える