mysql查询需要在具有find_in_set和group_concat关键字的sql服务器中进行转换

时间:2019-07-12 19:08:44

标签: mysql sql sql-server

我有两个表订单和公司。公司表包含唯一的公司ID和公司名称。

“订单”表有两列,一列是orderid,另一列是companyID。 CompanyId可以是多个逗号分隔的值。

我正在使用以下查询来获取与订单表中每个公司ID对应的公司名称。

SELECT 
    (SELECT GROUP_CONCAT(cmp.cmpny_name) 
    FROM company cmp 
    WHERE FIND_IN_SET(cmp.CompanyID, odr.companyIDs) 
    ) AS company
FROM orders odr

它在Mysql中工作得很好,但在sql server中却不能,因为这些关键字在sql server中不受支持,而且我在sql server上工作的还不是很多,所以请帮助我找到正确的方法来实现这一目标。

谢谢

在搜索中,我找到了一些关键字,例如用于组连合的东西,但无法正确使用。找不到与SQL Server的find_in_set等效的对象。

SELECT 
    (SELECT GROUP_CONCAT(cmp.cmpny_name) 
    FROM company cmp 
    WHERE FIND_IN_SET(cmp.CompanyID, odr.companyIDs) 
    ) AS company
FROM orders odr

在sql server中不工作

2 个答案:

答案 0 :(得分:0)

GroupConcat可以替换为STRING_AGG() 并且您还可以用CONCAT(',',yourVariable,',')LIKE CONCAT('%,',youOtherVariable,',%')

替换Find_In_Set

所以我认为这可能对您有帮助

SELECT 
    (SELECT STRING_AGG(cmp.cmpny_name,',') 
    FROM company cmp 
    WHERE CONCAT(',',cmp.CompanyID,',') LIKE CONCAT('%,',odr.companyIDs,',%') 
    ) AS company
FROM orders odr

参考:

FIND_IN_SET() equivalent in SQL Server

https://database.guide/the-sql-server-equivalent-to-group_concat/

答案 1 :(得分:0)

如果SQL Server 2016的较低拆分功能应以其他方式编写,则此方法应与SQL Server 2016一起使用

        SELECT 
          STUFF(  ( 
            SELECT ',' + cmp.cmpny_name
            FROM company cmp 
            WHERE cmp.CompanyID IN (SELECT value FROM STRING_SPLIT (odr.companyIDs,','))
           FOR XML PATH('')), 1, 1, NULL)  AS company
        FROM orders odr

如果是SQL Server 2017

        SELECT 
            (SELECT STRING_AGG(cmp.cmpny_name) 
            FROM company cmp 
            WHERE cmp.CompanyID in (SELECT value FROM string_split (odr.companyIDs,','))
            ) AS company
        FROM orders odr