我想了解为什么
SELECT *, regexp_matches(A, 'pattern') FROM table
即使我没有子句,也只会返回A有模式的行?patternWHERE
regexp_matches如果没有匹配,返回什么?我原以为是null,但如果是,null那么查询应该简单地返回null所有那些不匹配的结果吗?
如何构建自定义函数来做类似的事情:当参数适合时,过滤相应的行,这样我就不必追加where?
我想了解为什么
SELECT *, regexp_matches(A, 'pattern') FROM table
即使我没有子句,也只会返回A有模式的行?patternWHERE
regexp_matches如果没有匹配,返回什么?我原以为是null,但如果是,null那么查询应该简单地返回null所有那些不匹配的结果吗?
如何构建自定义函数来做类似的事情:当参数适合时,过滤相应的行,这样我就不必追加where?
这是使用 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 行)