检查字符串数组中的整数

时间:2015-12-14 22:27:42

标签: arrays postgresql types string-formatting plpgsql

我正在尝试检查字符串数组是否存在转换后的整数。这位于以下程序内:

nc_ecositeinteger变量
current_consite是一个字符串数组
ecositeinteger current_ecosite_ncdouble

IF to_char(nc_ecosite, '999') IN
   (select current_consite from current_site_record
    where current_ecosite_nc::integer = nc_ecosite) THEN
       ecosite := nc_ecosite;

结果始终来自第一个ELSIF之后的IF。当nc_ecosite在数组中时(来自检查),会发生这种情况。当值匹配时,为什么ecosite没有填充nc_ecosite

我正在使用pgAdmin中的Postgres 9.3。

2 个答案:

答案 0 :(得分:0)

问题的直接原因是to_char()为您的模式插入了前导空白(遗留原因 - 为潜在的负号留出空间)。使用FM Template Pattern Modifier来避免:

to_char(nc_ecosite, 'FM999')

当然,最好以匹配的数据类型开始操作 - 如果可能的话。

除此之外,我建议更快更清洁的声明:

   SELECT INTO ecosite  nc_ecosite  -- variable or column??
   WHERE  EXISTS (
      SELECT 1 FROM current_site_record c
      WHERE  current_ecosite_nc::integer = nc_ecosite
      AND    to_char(nc_ecosite, 'FM999') = ANY(current_consite)
      );

   IF NOT FOUND THEN  ... -- to replace your ELSIF

确保您不会遇到参数,变量和列名之间的命名冲突!一种普遍的惯例是在_之前添加变量名(并且永远不要对列名使用相同的名称)。但无论如何,您最好在所有查询中对列名进行表格限定。您没有明确哪个是列,哪个是变量......

如果我有完整的函数和表定义,我可以进一步优化语句。

相关:

答案 1 :(得分:0)

我发现以下内容可以提供所需的结果:

IF nc_ecosite in 
(select (unnest(string_to_array(current_consite, ',')))::integer 
from current_site_record 
where current_ecosite_nc::integer = nc_ecosite) THEN
   ecosite := nc_ecosite::integer;