如何在SQL Server中更新时避免使用特殊字符和空格

时间:2018-02-19 16:32:11

标签: sql-server sql-server-2008 sql-server-2012

我有一个关于SQL Server的问题:如何使用SQL Server中基于id和地址列的源表标志更新目标表标志。

在比较id和地址时间(源表和目标表)时,我们只需考虑字符和数字数据。

在更新时间时,只考虑字符和数字,不需要考虑任何空格或特殊字符。

示例:源表:

id | address            | Flag
1  | 700 N. C Apt J1w02 | 1

目标表:

id  | address            | Flag
1   | 700 N. C Apt J1w02 | 

我想使用源表ID +地址更新目标表的Flag

当我们不考虑空格和特殊字符和地址是700NCAptJ1w02时,源表地址和目标表地址是相同的 所以Flag将在目标表中更新标志是:1与其他人相似

输出为:目标表:

id  | address            | Flag
1   | 700 N. C Apt J1w02 | 1 

在目标表中,我们只需要更新Flag列。

另一个例子:

来源表:

id     |  address              | Flag
4      | 116 E Spence St #B    | 0

目标表:

id     | address                                      | Flag 
4      | 11 6 E Sp  enc     e             St #B NULL  |

当我们不考虑空格和特殊字符和地址是116ESpenceStB时,源表地址和目标表地址是相同的

表输出记录是:

id     | address                                          | Flag 
4      | 11  6 E Sp  enc     e             St #B    NULL  | 0

带脚本的示例表数据是:

---source table : 
CREATE TABLE [dbo].[sourcemp]
(
    [id] [int] NULL,
    [address] [varchar](200) NULL,
    [Flag] [int] NULL
) 

----Target table: we need update flag value using source table
CREATE TABLE [dbo].[targetemp]
(
    [id] [int] NULL,
    [address] [varchar](200) NULL,
    [Flag] [int] NULL
) 

INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (1, N'700 N. C Apt# J1w02', 1)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (1, N'7010 N COLTON', 0)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (1, N'0923 E 55th ten-332', 0)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (1, N'9717 E. 6TH AE #32', 0)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (2, N'5704 E Chattaroy Rd', 1)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (2, N'hen@ye   yte&t#100', 0)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (2, N'2903 E. Euclid, Apt. #40', 3)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (3, N'327 1/2 W. 2nd Ave RM SP3', 1)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (3, N'c/o DC!FS   1313 N. Atl*(antic   STE 2000', 2)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (4, N'2706 W. College Ave.', 1)
GO
INSERT [dbo].[sourcemp] ([id], [address], [Flag]) VALUES (4, N'116 E Spence St #B', 0)

GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (1, N'700 N. C Apt   J1w02', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (1, N'7010 N COLTON.', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (1, N'0923 E 55th ten-332', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (1, N'971%7    E. 6TH AE #32', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (2, N'5704 E        Chattaroy Rd', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (2, N'henye   yte&t100', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (2, N'2903 E. !Euclid, Apt. #40', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (3, N'327 1/2 W. 2nd Ave RM SP3', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (3, N'c/o DC!FS   1313 N. Atl*anticSTE 2000', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (4, N'2706 WCollege Ave.', NULL)
GO
INSERT [dbo].[targetemp] ([id], [address], [Flag]) VALUES (4, N'11  6 E Sp  enc     e             St #B', NULL)
GO

基于以上数据我想要输出如下:

id  |address                                    Flag
1   |700 N. C Apt   J1w02                           | 1
1   |7010 N COLTON.                                 |0
1   |0923 E 55th ten-332                            |0
1   |971%7    E. 6TH AE #32                         |0
2   |5704 E        Chattaroy Rd                 |1
2   |henye   yte&t100                           |0
2   |2903 E. !Euclid, Apt. #40                  |3
3   |327 1/2 W. 2nd Ave RM SP3                  |1
3   |c/o DC!FS   1313 N. Atl*anticSTE 2000          |2
4   |2706 WCollege Ave.                         |1
4   |11  6 E Sp  enc     e             St #B    |0

我试过以下

update target   set target.flag=source.flag
from   targetemp target  join sourcemp source 
 on  target.id=source.id and  
 substring (target.address, charindex( ' ', target.address,1),len(target.address))
 =substring (source.address, charindex( ' ', source.address,1),len(source.address))

以上查询未返回预期结果。

请告诉我如何编写查询以在SQL Server中实现此任务。

0 个答案:

没有答案