检查字符串数组中的整数

Check for integer in string array

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

nc_ecosite 是一个 integer 变量
current_consite 是字符串数组
ecosite 是一个 integer
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;

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

我在 pgAdmin 中使用 Postgres 9.3。

问题的直接原因是 to_char() 为您给定的模式插入了一个前导空格(遗留原因 - 为潜在的负号制作 space)。使用 FM Template Pattern Modifier 来避免这种情况:

to_char(nc_ecosite, '<b>FM</b>999')

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

除此之外,我建议使用这种更快更简洁的语句:

   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

确保您不会 运行 陷入参数、变量和列名之间的命名冲突!一个广泛的约定是在变量名前加上 _(并且永远不要对列名使用相同的名称)。但是无论如何,您最好在所有查询中对列名进行 table 限定。你没说清楚哪个是列哪个是变量...

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

相关:

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

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;