如何将结果列添加到表中?

时间:2019-01-05 23:30:16

标签: sql sql-server tsql

我正在SSMS中进行数据清理实践。我做了一个模拟的邮编表,需要清理:

enter image description here

然后我使用SUBSTRING抓取了上半部分和下半部分:

SELECT SUBSTRING(post_code,1,3)
FROM PostCode;

SELECT SUBSTRING(post_code, LEN(post_code)-2,LEN(post_code))
FROM PostCode

enter image description here

下一步,我尝试将2列添加到表中,然后将它们组合在一起。我该怎么办?

非常感谢您的帮助!

5 个答案:

答案 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));
然后,

firsthalfsecondhalf将在表中显示为列,就像其他任何列一样(除非您无法显式更改或设置其值,因为它们是根据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

导入它们,然后比较最终结果集以确保它们都很好。