可以创建 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 上写的,它在语法上可能不完全正确,但演示了这个概念。)
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 上写的,它在语法上可能不完全正确,但演示了这个概念。)