为什么regexp_matches没有匹配的行像过滤器一样工作,并且不返回?

col*_*ang 5 sql postgresql

我想了解原因

SELECT *, regexp_matches(A, 'pattern') FROM table
Run Code Online (Sandbox Code Playgroud)

只会返回A有模式的行pattern,即使我没有WHERE子句?

regexp_matches如果没有匹配会返回什么?我原以为是null,但如果是,null那么查询应该只返回null所有那些不匹配的结果?

如何构建自定义函数来执行类似的操作:当参数适合时,相应的行将被过滤,以便我不必追加where

Pav*_*ule 6

使用Set Returning Function作为标量函数是一个副作用.Set Returning函数返回一个表而不是标量函数,通常在FROM子句中使用.您可以像标量函数一样使用它(由于某些原因),但有时会产生非常奇怪的副作用.通常你不会在标量函数位置上使用这些函数.

postgres=# select * from foo;
 a 
---
 1
 2
(2 rows)

postgres=# select a, generate_series(1,0) from foo;
 a | generate_series 
---+-----------------
(0 rows)

postgres=# select a, generate_series(1,1) from foo;
 a | generate_series 
---+-----------------
 1 |               1
 2 |               1
(2 rows)

postgres=# select a, generate_series(1,2) from foo;
 a | generate_series 
---+-----------------
 1 |               1
 1 |               2
 2 |               1
 2 |               2
(4 rows)

可能你会使用带正则表达式的子串函数.它是标量函数:

postgres=# select 'Some string', substring('Ahoj29' from '^[0-9]+');
  ?column?   | substring 
-------------+-----------
 Some string | 
(1 row)

postgres=# select 'Some string', substring('Ahoj29' from '[0-9]+');
  ?column?   | substring 
-------------+-----------
 Some string | 29
(1 row)