我正在SSMS中进行数据清理实践。我做了一个模拟的邮编表,需要清理:
然后我使用SUBSTRING抓取了上半部分和下半部分:
SELECT SUBSTRING(post_code,1,3)
FROM PostCode;
SELECT SUBSTRING(post_code, LEN(post_code)-2,LEN(post_code))
FROM PostCode
下一步,我尝试将2列添加到表中,然后将它们组合在一起。我该怎么办?
非常感谢您的帮助!
答案 0 :(得分:0)
这是您想要的吗?
let o = {};
Object.assign(o, {
fn: {
a: function() {
var t = this; // this is o
t.fn.b(); // no error
}.bind(o),
b: function() { }.bind(o)
}
});
我发现您的邮政编码可能包含也可能没有多余的流水字符,例如空格或逗号。您可以在应用字符串操作之前尝试删除它们:
SELECT
SUBSTRING(post_code,1,3) AS first,
SUBSTRING(post_code, LEN(post_code)-2,LEN(post_code)) AS second
FROM PostCode;
答案 1 :(得分:0)
我建议LEFT()
和RIGHT()
提取组件:
SELECT LEFT(post_code, 3) as firsthalf,
RIGHT(post_code, 3) as secondhalf
FROM PostCode;
如果将post_code
存储为char(7)
而不是varchar(<something>)
,则此操作将无效。在这种情况下,请使用:
SELECT LEFT(post_code, 3) as firsthalf,
SUBSTR(post_code, LEN(post_code) - 2, 3) as secondhalf
FROM PostCode;
对于此答案的其余部分,如果需要,可以用上述表达式替换RIGHT(post_code, 3)
。
允许使用LEN(post_code)
作为secondhalf
的length参数,但会产生误导,因为您知道它是3个字符。
我不确定您的意思是什么
我试图将2列添加到表中,然后可以将它们组合在一起
但是SQL Server支持计算列:
alter table PostCode add firsthalf as (LEFT(post_code, 3));
alter table PostCode add secondhalf as (RIGHT(post_code, 3));
然后, firsthalf
和secondhalf
将在表中显示为列,就像其他任何列一样(除非您无法显式更改或设置其值,因为它们是根据post_code
计算出来的)。
您可以使用类似的逻辑创建“干净的邮政编码”:
alter table PostCode add cleanedPostCode as (LEFT(post_code, 3) + ' ' + RIGHT(post_code, 3));
答案 2 :(得分:0)
您需要串联:
SELECT SUBSTRING(post_code,1,3) + SUBSTRING(post_code, LEN(post_code)-2,LEN(post_code))
FROM PostCode;
如果这给您正确的结果,请更新:
update PostCode
set post_code = SUBSTRING(post_code,1,3) + SUBSTRING(post_code, LEN(post_code)-2,LEN(post_code))
答案 3 :(得分:0)
从您的comment
我试图将它们组合成一列,然后将其添加到我的表中,以替换原始的post_code列。
简单来说,您可以这样做
UPDATE PostCode
SET Post_Code = LEFT(Post_Code, 3) + RIGHT(Post_Code, 3);
或者如果字符串的开头/结尾处有空格
UPDATE PostCode
SET Post_Code = LEFT(TRIM(Post_Code), 3) + RIGHT(TRIM(Post_Code), 3);
请注意, TRIM()
仅在2017年版本上可用,如果没有,可以使用 LTRIM()
和 RTRIM()
的功能为
UPDATE PostCode
SET Post_Code = LEFT(LTRIM(RTRIM(Post_Code)), 3) + RIGHT(LTRIM(RTRIM(Post_Code)), 3);
答案 4 :(得分:0)
由于您弄乱了脏数据,如果您有很多行,则可能需要进行一些验证。
您可以建立一个验证列,例如:
case when
len(postcodeClean) = 6
and isnumeric(SUBSTRING(postcodeClean, 1, 1)) = 0
and isnumeric(SUBSTRING(postcodeClean, 2, 1)) = 1
and isnumeric(SUBSTRING(postcodeClean, 3, 1)) = 0
and isnumeric(SUBSTRING(postcodeClean, 4, 1)) = 1
and isnumeric(SUBSTRING(postcodeClean, 5, 1)) = 0
and isnumeric(SUBSTRING(postcodeClean, 6, 1)) = 1
then
'valid'
else
'not valid'
end [isItValid]
和/或-根据您的数据有多脏,您可能需要将其与所有有效的加拿大邮政编码进行比较。
您可以从
下载它们https://fusiontables.google.com/data?docid=1H_cl-oyeG4FDwqJUTeI_aGKmmkJdPDzRNccp96M#rows:id=1
导入它们,然后比较最终结果集以确保它们都很好。