函数“位置”不适用于文本函数中的空格

时间:2019-12-13 07:34:39

标签: postgresql

应该返回子字符串中第一个字符编号的函数示例。

CREATE OR REPLACE FUNCTION dbo.test(
  IN tstr character varying,
  IN delimiter character)
RETURNS int AS
$BODY$
BEGIN
  return position(delimiter in tstr);
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

给她打电话:

 select dbo.test('11',' ');

我们得到结果1,但是子字符串中没有空格!如何解决? 我在xcc_64-pc-linux-gnu上使用PostgreSQL 10.7,由gcc编译(Ubuntu 7.3.0-27ubuntu1〜18.04)7.3.0,64位

1 个答案:

答案 0 :(得分:2)

不确定根本原因是什么,但这是由于将参数声明为character(无论如何,您都是shouldn't be using charcharacter引起的。

您还可以看到,如果您还使用character参数显式调用position():

postgres=# select position(' '::character in '11');
 position
----------
        1
(1 row)

将函数声明更改为:

CREATE OR REPLACE FUNCTION dbo.test(
  IN tstr character varying,
  IN delimiter character varying)
...

您的示例函数将起作用。


请注意,像这样的简单函数最好写成SQL函数:

CREATE OR REPLACE FUNCTION dbo.test(IN tstr character varying, IN delimiter character varying)
  RETURNS int 
AS
$BODY$
  select position(delimiter in tstr);
$BODY$
LANGUAGE sql immutable;