检查字符串数组中的整数
Check for integer in string array
我正在尝试检查字符串数组是否存在转换后的整数。这位于以下过程中:
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;
结果总是来自第一个 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 定义,我也许可以进一步优化语句。
相关:
- Remove blank-padding from to_char() output
- Variables for identifiers inside IF EXISTS in a plpgsql function
- Naming conflict between function parameter and result of JOIN with USING clause
我发现以下内容可提供所需的结果:
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;
我正在尝试检查字符串数组是否存在转换后的整数。这位于以下过程中:
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;
结果总是来自第一个 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 定义,我也许可以进一步优化语句。
相关:
- Remove blank-padding from to_char() output
- Variables for identifiers inside IF EXISTS in a plpgsql function
- Naming conflict between function parameter and result of JOIN with USING clause
我发现以下内容可提供所需的结果:
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;