sqlite - 试图在串联后组织列的数据时卡住了
问题描述
我正在尝试从如下所示的 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
非常感谢您的帮助!
解决方案
不要在之后组织格式化数据,而是在通过初步查询消除重复并生成正确的顺序之前。作为子查询或公用表表达式 (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
推荐阅读
- c# - C# 测量特定应用程序的带宽
- vb.net - SqlDataSource InsertCommand 和 UpdateCommand 抛出“非法变量名/编号””
- javascript - node js async/await:为什么我无法获取数据?请求正文
- java - 我不能在 Java 11 中使用 @PostConstruct 和 @PostDestroy
- php - 无法使用 php 删除 memcache?但是可以用telnet
- angular - 使用 node 和 @angular/cli 构建的应用程序可以离线运行吗?
- jquery - html 数据属性的 attr() 返回 undefined
- sql-server - SQL Server 如何获取货币类型的小数位数?
- android - android Room获取blob图像并显示
- vba - 如何将变量分配给具有部分已知名称的 Excel 工作表