首页 > 解决方案 > 试图在串联后组织列的数据时卡住了

问题描述

我正在尝试从如下所示的 SQLite 表中提取数据:

IP                 PORT        PROTOCOL
-------------------------------------------
192.168.50.106     0           TCP
192.168.50.106     0           TCP
192.168.50.106     68          UDP
192.168.50.106     53          TCP
192.168.50.106     53          TCP

192.168.50.109     0           TCP
192.168.50.109     0           TCP
192.168.50.109     53          UDP
192.168.50.109     445         TCP
192.168.50.109     445         TCP
192.168.50.109     139         TCP

现在,使用命令:

SELECT IP, GROUP_CONCAT(Port, ',') From PortData WHERE Protocol = 'TCP' GROUP BY Ip ORDER BY IP ASC

我得到:

IP                    PORT
--------------------------------------
192.168.50.106        0,0,53,53
192.168.50.109        0,0,445,445,139

这真的很接近我的需要!我只需要“端口”列来仅显示不同的端口值,并按端口号升序排列。我很困惑如何在连接后组织第二列的数据。

如果您想要一个示例,这就是我试图让输出看起来的样子:

IP                    PORT
--------------------------------------
192.168.50.106        0,53
192.168.50.109        0,139,445

非常感谢您的帮助!

标签: sqlite

解决方案


不要在之后组织格式化数据,而是通过初步查询消除重复并生成正确的顺序之前。作为子查询或公用表表达式 (CTE)(即 WITH 子句)执行此操作。

(之后尝试排序和消除重复项基本上需要重新解析字符串,将其放入表中,排序和删除重复项,然后将其放回列表中。你只是绕了一圈。或者如果不在数据库,必须使用宿主语言来完成,但它需要相同的整体步骤。)

WITH prepped AS (
     SELECT IP, Port From PortData 
     WHERE Protocol = 'TCP' 
     GROUP BY IP, Port 
     ORDER BY IP, Port
)
SELECT IP, GROUP_CONCAT(Port, ',') 
FROM prepped 
GROUP BY Ip 
ORDER BY IP ASC

推荐阅读