-4

SQL 是否具有在表函数之外返回多列的函数的概念?这是一个例子:

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

我希望该SPLIT_NAME函数产生两列,一列用于第一列,另一列用于最后,因此输出将是:

id      first        last
1        tom         jones

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

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

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

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

但是,想知道 SQL 是否有任何可以产生多个输出的标量函数,因为我认为join如果加入像十亿行这样的东西(希望)函数本身可能只是内联。

注意:Postgres 或 SQL Server 都可以。

4

1 回答 1

2

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

  • 内联表值函数(即使您只返回一行,也允许多列)
  • APPLY 或 LATERAL JOIN 为每个输入行调用函数

例如,SQL Server 可以写成...

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

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


编辑:内联表值函数的一个例子......

同样,这是特定于 SQL Server 的,不能推广到其他 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

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

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

于 2021-11-02T23:52:43.320 回答