去掉空格和比较两个字符串

问题描述 投票:0回答:2

我想比较2个表,看看他们的其中一列的值是相同的。下面是写的代码:

    select T1.TaskCMPLTDetails,T2.TaskCMPLTDetails, T1.RequestID,T2.RequestID, t1.ProtocolID,t2.ProtocolID, t1.BuildCMPLTDT, t2.BuildCMPLTDT
    From table as T1 inner join table as T2
    on  T1.ProtocolID  = T2.ProtocolID 
    where REPLACE(LTRIM(RTRIM(T1.TaskCMPLTDetails)), '  ', ' ') <> REPLACE(LTRIM(RTRIM(T2.TaskCMPLTDetails)), '  ', ' ') 
    and t1.BuildCMPLTDT=t2.BuildCMPLTDT 

而且,这里是我回来的结果; (复制仅一排):

Y,Val,2017,1158,    Y, Val, 2017, 1158,   2017  2017    1158    1158    1900-01-01  1900-01-01

正如你可以在结果看,TaskCMPLTDetails对于两个表是相同的,为什么我看?该代码应该返回DONOT具有相同TaskCMPLTDetails的结果!

sql
2个回答
2
投票

有了这个说法:

REPLACE(LTRIM(RTRIM(T1.TaskCMPLTDetails)), '  ', ' ')

你用1个空格替换每两个相邻的空间。 因此,当你列的值中有3位是这样的:

'A   B' (3 spaces)

结果将是:

'A  B'  (2 spaces)

因为在初始值仅2相邻空间经1个空间取代, 所以这一结果还含有2米相邻的空间。 该REPLACE功能的作用只有一次,而不是递归,直到没有任何两个相邻的空间,以便一次又一次地更换。 你的问题的解决方案是比较它们事先取出两列的所有空间,因为该列包含逗号分隔值所以不会有不必要在这种情况下,值的连接(或者所以从您发布的样本数据似乎):

where REPLACE(T1.TaskCMPLTDetails, ' ', '') <> REPLACE(T2.TaskCMPLTDetails, ' ', '')

0
投票

你可以使用一个简单的修剪()TRIM(T1.TaskCMPLTDetails)<> TRIM(T2.TaskCMPLTDetails)

    select T1.TaskCMPLTDetails
      ,T2.TaskCMPLTDetails
      , T1.RequestID
      ,T2.RequestID
      , t1.ProtocolID
      ,t2.ProtocolID
      , t1.BuildCMPLTDT
      , t2.BuildCMPLTDT
    From table as T1 
    inner join table as T2  on  T1.ProtocolID  = T2.ProtocolID 
    where  TRIM(T1.TaskCMPLTDetails) <> TRIM(T2.TaskCMPLTDetails)
    and t1.BuildCMPLTDT=t2.BuildCMPLTDT 
© www.soinside.com 2019 - 2024. All rights reserved.