查找具有前缀和后缀的匹配数字

Find matching numbers with prefix and suffix

我有以下 table 示例记录。

CREATE TABLE Testtbl
(
    Number1 int,
    Number2 int,
    AddressA varchar(50),
    AddressB varchar(50),
    originalNumber1 int,
    originalNumber2 int
);

记录:

INSERT INTO Testtbl VALUES(12345,9876,'A1','B1',9876,12345),
                          (4321,761,'A2','B2',924321,761110),
                          (159,9544,'A3','B3',929544,110159),
                          (158,98714,'A4','B4',110158,9298714),
                          (105,9804,'A5','B5',105110,9804110);

我想找到 Number1originalNumber1Number2originalNumber2 列的匹配项。如果匹配则显示 Number1 值,否则显示 originalNumber1.

originalNumber1originalNumber2 包含前缀和后缀,如记录 92110 中所示。

预期输出:

Num1    Num2
-------------
9876    12345
4321    761
929544  1110159
158     98714
105     9804

我的尝试:

SELECT  CASE WHEN Number1 LIKE '%'+ CAST(OriginalNumber1 AS VARCHAR(20)) +'%' 
                THEN Number1 ELSE OriginalNumber1 END AS Num1,
        CASE WHEN Number2 LIKE '%'+ CAST(OriginalNumber2 AS VARCHAR(20)) +'%' 
                THEN Number2 ELSE OriginalNumber2 END AS Num2
FROM Testtbl

使用CASE

SELECT  CASE WHEN OriginalNumber1 LIKE '%'+ CAST(Number1 AS VARCHAR(20)) +'%' 
                   THEN Number1                 
                ELSE OriginalNumber1 END AS Num1,
        CASE WHEN  OriginalNumber2 LIKE '%'+ CAST(Number2 AS VARCHAR(20)) +'%' 
                  THEN Number2              
                ELSE OriginalNumber2 END AS Num2
FROM #Testtbl

我想你可以这样做

Select 
case when number1 = originalNumber1Clean  then number1 else originalNumber1  end as num1
,case when number2 = originalNumber2Clean  then number2 else originalNumber2  end as num2 

 from (
select *
,case when left(originalNumber1,2) = 92  
          then substring(cast(originalNumber1 as varchar),3,len(cast(originalNumber1 as varchar)))

 when right(originalNumber1,2) = 92     
then reverse(substring(cast(reverse(originalnumber1) as varchar),3, len(cast(originalNumber1 as varchar)))) 

 when left(originalNumber1,3) = 110  
          then substring(cast(originalNumber1 as varchar),4,len(cast(originalNumber1 as varchar)))

 when right(originalNumber1,3) = 110    
then reverse(substring(cast(reverse(originalnumber1) as varchar),4, len(cast(originalNumber1 as varchar)))) 
           else originalnumber1 end as OriginalNumber1Clean


           ,case when left(originalNumber2,2) = 92  
          then substring(cast(originalNumber2 as varchar),3,len(cast(originalNumber2 as varchar)))

 when right(originalNumber2,2) = 92     
then reverse(substring(cast(reverse(originalNumber2) as varchar),3, len(cast(originalNumber2 as varchar)))) 

 when left(originalNumber2,3) = 110  
          then substring(cast(originalNumber2 as varchar),4,len(cast(originalNumber2 as varchar)))

 when right(originalNumber2,3) = 110    
then reverse(substring(cast(reverse(originalNumber2) as varchar),4, len(cast(originalNumber2 as varchar)))) 
           else originalNumber2 end as OriginalNumber2Clean

         from Testtbl
         )x