繁体   English   中英

Azure Synapse Analytics SQL 数据库 function 获取两个分隔列表之间的匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM