SQL 将列连接成字符串并只提取地址
SQL concatenate columns into string and only pull address
我有 4 个地址字段,但地址字段可以为空,并且在 4 个字段之一中有一个人的姓名。名称通常在地址开头之前。我需要做的是删除名称和空字符串,只提取以数字开头的核心地址或列。
例如:
Select sourceaddr1, sourceaddr2, sourceaddr3, sourceaddr4
From MyTable
结果:
我要看的是只在一个字符串中的核心地址
像这样..
10767CHILDRESSCT
如果您需要第二个填写的地址字段,您可以使用apply
和一些反透视逻辑:
select t.*, s.sourceaddr
from mytable t cross apply
(select v.sourceaddr
from (values (1, t.sourceaddr1),
(2, t.sourceaddr2),
(3, t.sourceaddr3),
(4, t.sourceaddr4)
) v(i, sourceaddr)
where sourceaddr is not null
order by i
offset 1 fetch first 1 row only
) s;
编辑:
您也可以表示为:
select t.*, s.sourceaddr
from mytable t cross apply
(select v.sourceaddr, row_number() over (order by i) as seqnum
from (values (1, t.sourceaddr1),
(2, t.sourceaddr2),
(3, t.sourceaddr3),
(4, t.sourceaddr4)
) v(i, sourceaddr)
where sourceaddr is not null
offset 1 fetch first 1 row only
) s
where seqnum = 2;
我采取了不同的方向。
首先,我像这样在一个临时 table 中将 4 个 sourceaddr 字段连接在一起。
IF OBJECT_ID('tempdb..#core') IS NOT NULL DROP TABLE #core
SELECT DISTINCT
,'ADDR2' = REPLACE(SOURCEADDR1, ' ','')+REPLACE(SOURCEADDR2, ' ','')+REPLACE(SOURCEADDR3, ' ','')+REPLACE(SOURCEADDR4, ' ','')
into #core
FROM table
接下来我创建了另一个临时文件 table 并引入了连接字段并删除了所有字母字符,就像这样。
IF OBJECT_ID('tempdb..#coreadd') IS NOT NULL DROP TABLE #coreadd
Select
, 'CoreAdd' = stuff(addr2, 1, patindex('%[0-9]%', addr2)-1, '')
into #coreadd
from #core
通过使用 STUFF
函数和上述逻辑,我能够像这样将所有核心地址连接在一起。此逻辑删除任何空字符串字段,仅查找字符串中的第一个数字。
结果:
10767CHILDRESSCT
我有 4 个地址字段,但地址字段可以为空,并且在 4 个字段之一中有一个人的姓名。名称通常在地址开头之前。我需要做的是删除名称和空字符串,只提取以数字开头的核心地址或列。
例如:
Select sourceaddr1, sourceaddr2, sourceaddr3, sourceaddr4
From MyTable
结果:
我要看的是只在一个字符串中的核心地址 像这样..
10767CHILDRESSCT
如果您需要第二个填写的地址字段,您可以使用apply
和一些反透视逻辑:
select t.*, s.sourceaddr
from mytable t cross apply
(select v.sourceaddr
from (values (1, t.sourceaddr1),
(2, t.sourceaddr2),
(3, t.sourceaddr3),
(4, t.sourceaddr4)
) v(i, sourceaddr)
where sourceaddr is not null
order by i
offset 1 fetch first 1 row only
) s;
编辑:
您也可以表示为:
select t.*, s.sourceaddr
from mytable t cross apply
(select v.sourceaddr, row_number() over (order by i) as seqnum
from (values (1, t.sourceaddr1),
(2, t.sourceaddr2),
(3, t.sourceaddr3),
(4, t.sourceaddr4)
) v(i, sourceaddr)
where sourceaddr is not null
offset 1 fetch first 1 row only
) s
where seqnum = 2;
我采取了不同的方向。
首先,我像这样在一个临时 table 中将 4 个 sourceaddr 字段连接在一起。
IF OBJECT_ID('tempdb..#core') IS NOT NULL DROP TABLE #core
SELECT DISTINCT
,'ADDR2' = REPLACE(SOURCEADDR1, ' ','')+REPLACE(SOURCEADDR2, ' ','')+REPLACE(SOURCEADDR3, ' ','')+REPLACE(SOURCEADDR4, ' ','')
into #core
FROM table
接下来我创建了另一个临时文件 table 并引入了连接字段并删除了所有字母字符,就像这样。
IF OBJECT_ID('tempdb..#coreadd') IS NOT NULL DROP TABLE #coreadd
Select
, 'CoreAdd' = stuff(addr2, 1, patindex('%[0-9]%', addr2)-1, '')
into #coreadd
from #core
通过使用 STUFF
函数和上述逻辑,我能够像这样将所有核心地址连接在一起。此逻辑删除任何空字符串字段,仅查找字符串中的第一个数字。
结果:
10767CHILDRESSCT