与this question类似,如何查找数组中是否存在NULL值?
这里有一些尝试。
SELECT num, ar, expected,
ar @> ARRAY[NULL]::int[] AS test1,
NULL = ANY (ar) AS test2,
array_to_string(ar, ', ') <> array_to_string(ar, ', ', '(null)') AS test3
FROM (
SELECT 1 AS num, '{1,2,NULL}'::int[] AS ar, true AS expected
UNION SELECT 2, '{1,2,3}'::int[], false
) td ORDER BY num;
num | ar | expected | test1 | test2 | test3
-----+------------+----------+-------+-------+-------
1 | {1,2,NULL} | t | f | | t
2 | {1,2,3} | f | f | | f
(2 rows)
字符串
只有array_to_string
的技巧显示了期望值。有没有更好的方法来测试这个?
4条答案
按热度按时间oknwwptz1#
Postgres 9.5或更高版本
使用**
array_position()
**。基本上:字符串
请参见下面的演示。
Postgres 9.3或更高版本
您可以使用内置函数
array_remove()
或array_replace()
进行测试。Postgres 9.1或任意版本
如果你 * 知道 * 一个元素永远不可能存在于你的数组中,你可以使用这个 fast 表达式。假设你有一个正数数组,
-1
永远不会在里面:型
相关答案及详细解释:
如果你不能绝对确定,你可以使用
unnest()
中一个昂贵但安全的方法。喜欢的:型
或者:
型
但是,您可以使用
CASE
表达式获得 * 快速和安全 *。使用一个不太可能的数字,并回退到安全的方法,如果它应该存在。您可能需要单独处理arr IS NULL
案例。请参见下面的演示。Demo
型
测试结果:
型
注意
array_remove()
和array_position()
不允许用于多维数组。t_93a
右边的所有表达式都只适用于一维数组。老麻雀
Benchmark设置
添加的时间来自Postgres 9.5中的200 k行基准测试。这是我的设置:
型
函数封装
为了重复使用,我会在Postgres9.5中创建一个函数如下:
型
PARALLEL SAFE
仅适用于Postgres 9.6或更高版本。使用多态输入类型,这适用于 * 任何 * 数组类型,而不仅仅是
int[]
。将其设置为
IMMUTABLE
以允许性能优化和索引表达式。但不要将其设置为
STRICT
,这将禁用“函数内联”并损害性能,因为array_position()
本身不是STRICT
。请参阅:如果您需要捕获案例
arr IS NULL
:型
对于Postgres9.1,使用上面的
t_91
表达式。其余适用不变。密切相关:
piwo6bdm2#
PostgreSQL的UNNEST()函数是一个更好的选择。你可以写一个简单的函数来检查数组中的NULL值。
字符串
比如说,
型
测试结果:
型
所以,您可以在查询中使用
NULL_EXISTS()
函数,如下所示。型
vwoqyblh3#
PostgreSQL 9.5(我知道你指定了9.1,但无论如何)有
array_position()
函数来做你想做的事情,而不必使用效率极低的unnest()
来处理像这样微不足道的事情(参见test4
):字符串
zzlelutf4#
我用这个
字符串
array_position-返回数组中第二个参数第一次出现的下标,从第三个参数指示的元素或第一个元素开始(数组必须是一维的)