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 是否有任何可以產生多個輸出的標量函式,因為我認為 ajoin可能會非常昂貴(我認為?)如果加入十億行(希望)函式本身可能只是行內。
注意:Postgres 或 SQL Server 都可以。
uj5u.com熱心網友回復:
您需要的兩個概念是...
- 行內表值函式(即使只回傳一行,也允許多列)
- 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 子句,但不是必須的)和一些引數。
(我在手機上寫的,它在語法上可能不完全正確,但演示了這個概念。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/346149.html
