我在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行应该返回任何结果。 ?
答案 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)