使用mssql查询选择不同的前两个八位字节
我的MS SQL表中的示例数据使用mssql查询选择不同的前两个八位字节,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我的MS SQL表中的示例数据 Column Name: IPAddress 1.18.120.201,192.178.120.201 192.168.120.202,192.188.120.202,192.198.120.202 192.168.121.3 192.169.121.50 1.1.1.1 11.11.11.11 作为我想要的输出 192.168 192.169 192.178 192.188 192.198 1.18 1.1 11.11 IPAddress列也可以有多个ip地
Column Name: IPAddress
1.18.120.201,192.178.120.201
192.168.120.202,192.188.120.202,192.198.120.202
192.168.121.3
192.169.121.50
1.1.1.1
11.11.11.11
作为我想要的输出
192.168
192.169
192.178
192.188
192.198
1.18
1.1
11.11
IPAddress
列也可以有多个ip地址值
我写了下面这样的东西。请让我知道我需要在查询中做哪些更改
SELECT
SUBSTRING(IPAddress, 1, LEN(IPAddress) - CHARINDEX('.',REVERSE(IPAddress))),
COUNT(*)
FROM
...
GROUP BY
SUBSTRING(IPAddress, 1, LEN(IPAddress) - CHARINDEX('.',REVERSE(IPAddress)))
试试下面这个
;WITH cte(IPAddress)
AS
(
SELECT '1.18.120.201,192.178.120.201' UNION ALL
SELECT '192.168.120.202,192.188.120.202,192.198.120.202' UNION ALL
SELECT '192.168.121.3' UNION ALL
SELECT '192.169.121.50' UNION ALL
SELECT '1.1.1.1' UNION ALL
SELECT '11.11.11.11'
)
SELECT DISTINCT SUBSTRING(IPAddress, 0, CHARINDEX('.', IPAddress, CHARINDEX('.', IPAddress) + 1)) AS IPAddress
FROM (
SELECT Split.a.value('.', 'VARCHAR(1000)') AS IPAddress
FROM (
SELECT CAST('<S>' + REPLACE(IPAddress, ',', '</S><S>') + '</S>' AS XML) AS IPAddress
FROM cte
) AS A
CROSS APPLY IPAddress.nodes('/S') AS Split(a)
) DT
ORDER BY 1 DESC
我将使用以下解决方案:
SELECT x.ID, y.XmlCol.value('concat(i[1], ".", i[2])', 'VARCHAR(50)')
FROM (
SELECT ID, CONVERT(XML, '<root><ip><i>' + REPLACE(REPLACE(IP, ',', '</i></ip><ip><i>'), '.', '</i><i>') + '</i></ip></root>') AS IPAsXML
FROM @SourceTable s
) x OUTER APPLY x.IPAsXML.nodes('root/ip') y(XmlCol)
选择x.ID,y.XmlCol.value('concat(i[1],“,”i[2]),'VARCHAR(50)'))
从(
选择ID,将(XML)、+REPLACE(REPLACE(IP)、、、、、、、、、、)+)转换为IPAsXML
来自@sources表
)x外部应用x.IPAsXML.nodes('root/ip')y(XmlCol)
结果:
您的查询将为某些IP返回三个八位字节,这些IP具有值,例如
11.1.1.1'或1.1.1.1`我的代码根据您的示例数据和预期结果工作,我怎么知道你的表格中的数据?在列中添加更多样本数据,并具有预期的输出?等一下,我会给你回复为什么我需要创建一个表格。仅供参考。您可以直接在数据表上使用查询。只需修改代码检查一下\@mealhour您检查了修改后的代码了吗
create table #t(IPAddress varchar(15))
insert into #t(IPAddress)
select '192.168.120.201'
union all select '192.178.120.201'
union all select '192.168.120.202'
union all select '192.188.120.202'
union all select '192.198.120.202'
union all select '192.168.121.3'
union all select '192.169.121.50'
select DIstinct parsename(IPAddress,4) +'.'+parsename(IPAddress,3) from #t
SELECT x.ID, y.XmlCol.value('concat(i[1], ".", i[2])', 'VARCHAR(50)')
FROM (
SELECT ID, CONVERT(XML, '<root><ip><i>' + REPLACE(REPLACE(IP, ',', '</i></ip><ip><i>'), '.', '</i><i>') + '</i></ip></root>') AS IPAsXML
FROM @SourceTable s
) x OUTER APPLY x.IPAsXML.nodes('root/ip') y(XmlCol)