5

我想了解为什么

SELECT *, regexp_matches(A, 'pattern') FROM table

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

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

如何构建自定义函数来做类似的事情:当参数适合时,过滤相应的行,这样我就不必追加where

4

1 回答 1

7

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

postgres=# select * from foo;
 一种
---
 1
 2
(2 行)

postgres=# select a, generate_series(1,0) from foo;
 一个 | 生成系列
---+--------
(0 行)

postgres=# select a, generate_series(1,1) from foo;
 一个 | 生成系列
---+--------
 1 | 1
 2 | 1
(2 行)

postgres=# select a, generate_series(1,2) from foo;
 一个 | 生成系列
---+--------
 1 | 1
 1 | 2
 2 | 1
 2 | 2
(4 行)

可能您会使用带有正则表达式的子字符串函数。它是标量函数:

postgres=# select 'Some string', substring('Ahoj29' from '^[0-9]+');
  ?柱子?| 子串
-------------+------------
 一些字符串 |
(1 行)

postgres=# select 'Some string', substring('Ahoj29' from '[0-9]+');
  ?柱子?| 子串
-------------+------------
 一些字符串 | 29
(1 行)
于 2013-10-15T17:18:16.460 回答