我正在尝试检查字符串数组是否存在转换后的整数。这位于以下程序内:
nc_ecosite
是integer
变量
current_consite
是一个字符串数组
ecosite
是integer
current_ecosite_nc
为double
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。
答案 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;