sql - 选择邮政编码并放入新列
问题描述
我有一个 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
谢谢您的帮助!
解决方案
PATINDEX
可以使用与 a 相同的语法找到这种模式的位置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;
对 reextester 的测试在这里
推荐阅读
- javascript - 如何在 React js 中使用 setstate 而不重新渲染组件?
- c++ - 使用 int、long int、unsigned int 对代码的执行时间有什么显着影响吗?
- c# - 当计时器结束并且没有杀死足够多的敌人时如何将玩家带到失败的场景
- vue.js - 单击后 VUE 方法仅接收最后一个元素的属性
- process - 如果在架构中,同一信号有 2 个不同的分配,但其中一个在一个进程中怎么办?
- web-services - 创建实体的示例请求 XML
- react-native - 反应原生意外令牌功能
- vba - 如何解决 VBA 插入链接表错误 3134?
- c# - 订购父/子列表
- javascript - 我的模态按钮关闭不起作用