![](/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.