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