2017-05-17 15 views
1

PostgreSQLデータベースバージョン9.6でクエリを実行していました。 Iは、クエリで200のURLを有するテーブルimage_urlsからURLを選択した:なぜ選択でのデータ操作はクエリ結果セットのサイズの減少につながるのですか?

select url from image_urls limit 10;

このクエリは10件のURLで正しい出力を返しました。 しかし、私はhttpsのURLの代わりにhttpのURLを持つイメージのURLを選択したかった。 だから、私は正規表現でURLを一致させるためにしようとしたクエリの助けを借りて、正規表現の一致によって返されたテキスト配列の次元を確認:

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

上記のクエリは、0の結果を返していました。

私は結果のデータセットの列の選択における操作がデータセットのサイズをいかに縮小するか理解できませんでした。結果が何であれ、少なくとも10行が返されているはずです。 ?

答えて

0

あなたは少なくとも一つの試合を持っている場合は、regexp_matchesの結果が配列である:あなたが一致まったく持っていない場合

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

機能を、1行の行を戻さないことができ、または複数の行(以下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) 
関連する問題