可以创建 returns 多列的函数吗?

Possible to create a function that returns more than one column?

SQL 在 table 函数之外是否有 returns 多列函数的概念?这是一个例子:

SELECT
    id,
    SPLIT_NAME(name, ' ')
FROM
    table

我希望 SPLIT_NAME 函数生成两列,一列用于第一列,一列用于最后,因此输出为:

id      first        last
1        tom         jones

我知道这可以通过以下方式完成:

SELECT id, SPLIT(...) first, SPLIT(...) last FROM table

或者可能使用 table 函数,例如:

SELECT id, first, last FROM table, SPLIT_NAME(name, ' ')

但是,想知道 SQL 是否有任何类型的标量函数可以产生多个输出,因为我认为 join 如果加入某个东西可能会非常昂贵(我认为?)像十亿行,其中(希望)函数本身可以被内联。

注意:Postgres 或 SQL 服务器都可以。

您需要的两个概念是...

  • 内联 table 值函数(即使你只有 return 一行,也允许多列)
  • APPLY 或 LATERAL JOIN 为每个输入行调用函数

SQL服务器,例如可以写成...

SELECT
  table.id,
  name_parts.first_name,
  name_parts.last_name
FROM
  table
CROSS APPLY
  SPLIT_NAME(table.name, ' ')   AS name_parts

其他方言可能使用横向连接、不同的功能一起使用,或者可能根本没有这些功能。


编辑:内联 table 值函数的示例...

同样,这是 SQL 服务器特定的,不会推广到其他 DBMS...

CREATE FUNCTION [dbo].[SPLIT_NAME] (@name NVARCHAR(MAX))
RETURNS TABLE
AS
RETURN
  SELECT
    SUBSTRING(@name, 1, PATINDEX('% %',@name)            ) AS first_name,
    SUBSTRING(@name,    PATINDEX('% %',@name), LEN(@name)) AS last_name

它是内联的,因为没有begin/end、过程语言等。它只是一个SELECT语句(可以有一个FROM子句,但不是必须的)和一些参数.

(我在 phone 上写的,它在语法上可能不完全正确,但演示了这个概念。)