![](/img/trans.png)
[英]Loading data into Azure Synapse Analytics from Azure SQL Database
[英]Azure Synapse Analytics SQL Database function to get match between two delimited lists
我正在使用 Azure Synapse Analytics SQL 數據庫。 我知道我不能在標量 function 中使用選擇(因此出現錯誤The SELECT statement is not allowed in user-defined functions
)。 我正在尋找解決方法,因為此 function 不依賴於任何表格。 目標是一個標量 function,它采用兩個定界列表參數,一個定界符參數,如果列表具有一個或多個匹配項,則返回 1,如果未找到匹配項,則返回 0。
--The SELECT statement is not allowed in user-defined functions
CREATE FUNCTION util.get_lsts_have_mtch
(
@p_lst_1 VARCHAR(8000),
@p_lst_2 VARCHAR(8000),
@p_dlmtr CHAR(1)
)
RETURNS BIT
/***********************************************************************************************************
Description: This function returns 1 if two delimited lists have an item that exists in both lists.
--Example run:
SELECT util.get_lsts_have_mtch('AB|CD|EF|GH|IJ','UV|WX|CD|IJ|YZ','|') -- returns 1, there's a match
SELECT util.get_lsts_have_mtch('AB|CD|EF|GH|IJ','ST|UV|WX|YZ','|') -- returns 0, there's no match
**********************************************************************************************************/
AS
BEGIN
DECLARE @v_result BIT;
-- *** CAN THIS BE ACCOMPLISHED EFFICIENTLY WITHOUT ANY SELECTS? ***
SET @v_result = (SELECT CAST(CASE WHEN EXISTS (SELECT 1
FROM STRING_SPLIT(@p_lst_1, @p_dlmtr) AS tokens_1
INNER JOIN STRING_SPLIT(@p_lst_2, @p_dlmtr) AS tokens_2
ON tokens_1.value = tokens_2.value)
THEN 1
ELSE 0
END) AS BIT);
RETURN @v_result;
END;
我放棄了 function 並使用了這個 CASE 語句。 我想要一個 function 加入,這樣可以重復使用。 如果有人能找到 function 來執行此操作,我會將其設為可接受的答案。
SELECT ...
FROM tbl_1
JOIN tbl_2
ON
-- wanted: util.get_lsts_have_mtch(tbl_1.my_lst, tbl_2.my_lst, '|') = 1
-- but settled for:
CASE WHEN EXISTS
(SELECT [value]
FROM STRING_SPLIT(tbl_1.my_lst, '|')
INTERSECT
SELECT [value]
FROM STRING_SPLIT(tbl_2.my_lst, '|'))
THEN 1
ELSE 0
END = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.