使用mssql查询选择不同的前两个八位字节

使用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地

我的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地址值

我写了下面这样的东西。请让我知道我需要在查询中做哪些更改

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)