为什么选择中的数据操作会导致查询结果集的大小减小?

时间:2017-05-17 20:16:57

标签: postgresql-9.6

我在Postgresql数据库版本9.6上运行查询。 我正在从表格中选择网址image_urls,其中包含200个带有查询的网址:

select url from image_urls limit 10;

此查询返回10个url的正确输出。 但是,我想选择具有http网址而不是https网址的图片网址。 所以,我试图将url与正则表达式匹配,并在查询的帮助下检查正则表达式匹配返回的文本数组的维度:

select array_length(regexp_matches(url, '^http(?!s)', 'g'), 1) from image_urls limit 10;

以上查询返回0结果。

我无法理解在结果数据集中选择列的操作如何减少数据集的大小,即。至少10行应该返回任何结果。 ?

1 个答案:

答案 0 :(得分:0)

如果您至少有一个匹配项,则regexp_matches的结果为array:

t=# select regexp_matches(tablename, '^pg(?!s)', 'g') from pg_tables limit 1;
 regexp_matches
----------------
 {pg}
(1 row)

如果您没有匹配项 - the result is not empty array, but no rows

  

该函数不能返回任何行,一行或多行(参见g   以下标志)

t=# select regexp_matches(tablename, '^http(?!s)', 'g') from pg_tables;
 regexp_matches
----------------
(0 rows)

并且最后没有行的array_length没有给出行:

t=# with no_rows_returned as (select ARRAY[1,2] aa from pg_tables where false)
select array_length(aa,1) from no_rows_returned;
 array_length
--------------
(0 rows)

这种行为并不例外,另一个例子没有没有WHERE子句的行:

t=# select json_agg(tablename) filter (where tablename = 'no such table') from pg_tables;
 json_agg
----------

(1 row)

t=# select unnest(array_remove(array_remove(ARRAY[1,2],1),2));
 unnest
--------
(0 rows)