簡體   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