选择邮政编码并放入新列

时间:2019-03-01 09:02:48

标签: sql sql-server

我有一个sql表,其中包含具有很多信息的列。在此列中,我只需要邮政编码。我可以使用以下方式选择包含邮政编码的行:

SELECT *
FROM Flow
Where Title LIKE '% [0-9] [0-9] [0-9] [0-9] [A-Z] [A-Z]%'

示例数据:

B2 (Use Ambu: b-ride care) 13401 Rit 24530 Amsterdam Linnaeusstraat 1093EN Basic team Oost-Watergraafsmeer
B2 Outpatient clinic Urology Route 23 Wagnerlaan Arnhem 6815AD 17143
B2 (Use Ambu: b-ride care) 13401 Rit 24531 Amsterdam Vrolikstraat 1092TX
B2 Outpatient clinic Urology Route 23 Wagnerlaan Arnhem 6815AD 17143
A2 Weth R A Wieggersstraat Giesbeek 6987BD 17145

但是现在我只想将这些行中的邮政编码放入另一个具有邮政编码名称的列中。

结果:

ZipCode
1093EN
6815AD
1092TX
6815AD
6987BD

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

PATINDEX可以使用与LIKE相同的语法来找到这种模式的位置。

有了职位,SUBSTRING就可以得到它。

SELECT *, 
 SUBSTRING(Title, PATINDEX('%[^0-9A-Z][0-9][0-9][0-9][0-9][A-Z][A-Z][^0-9A-Z]%', Title+' ')+1, 6) AS ZipCode
FROM Flow
WHERE Title+' ' LIKE '%[^0-9A-Z][0-9][0-9][0-9][0-9][A-Z][A-Z][^0-9A-Z]%'

如果没有WHERE子句过滤具有ZipCode的记录,则PATINDEX在没有ZipCode时将返回0。
然后,为了避免SUBSTRING仍然会从字符串中返回某些内容,最好将它包装在CASE中。

SELECT *, 
(CASE
 WHEN PATINDEX('%[^0-9A-Z][0-9][0-9][0-9][0-9][A-Z][A-Z][^0-9A-Z]%', Title+' ') > 0
  THEN SUBSTRING(Title, PATINDEX('%[^0-9A-Z][0-9][0-9][0-9][0-9][A-Z][A-Z][^0-9A-Z]%', Title+' ')+1, 6) 
  END) AS ZipCode
FROM Flow

额外:

关于另一个表。
这是一个使用临时表进行演示的示例片段:

-- Using a temporary table for the example
CREATE TABLE #Flow (
  Id int primary key identity(1,1) not null,
  Col1 VARCHAR(8) not null,
  Title NVARCHAR(100) not null,
  ZipCode VARCHAR(6)
);

-- Sample data
INSERT INTO #Flow (Col1, Title) VALUES
('B2X1', N'B2 (Use Ambu: b-ride care) 13401 Rit 24531 Amsterdam Vrolikstraat 1092TX'),
('B2X2', N'B2 Outpatient clinic Urology Route 23 Wagnerlaan Arnhem 6815AD 17143'),
('A2Y1', N'A2 Weth R A Wieggersstraat Giesbeek 6987BD 17145');

 CREATE TABLE #OtherTable (
  Id int primary key identity(1,1) not null,
  OtherCol1 VARCHAR(8) not null,
  FlowId INT,
  ZipCode VARCHAR(6)
);

-- update the ZipCode in the origin table
UPDATE  #Flow
SET ZipCode = SUBSTRING(Title, PATINDEX('%[^0-9A-Z][0-9][0-9][0-9][0-9][A-Z][A-Z][^0-9A-Z]%', Title+' ')+1, 6) 
WHERE ZipCode IS NULL
   AND PATINDEX('%[^0-9A-Z][0-9][0-9][0-9][0-9][A-Z][A-Z][^0-9A-Z]%', Title+' ') > 0;

SELECT * FROM  #Flow;

INSERT INTO #OtherTable (OtherCol1, FlowId, ZipCode)
SELECT f.Col1, f.Id, f.ZipCode
FROM #Flow f
ORDER BY f.Col1 DESC, f.Id ASC;

SELECT * FROM  #OtherTable;

在妊娠here上进行的测试

答案 1 :(得分:0)

替代:

SELECT *, 
 SUBSTRING(yazi, PATINDEX('%[0-9][0-9][0-9][0-9][A-Z][A-Z]%', yazi), 6) AS ZipCode
FROM #Onder