SQL Server加入通配符并在第一次匹配时停止

时间:2016-10-10 15:03:55

标签: sql sql-server tsql

    IF OBJECT_ID('tempdb..#TABLE1') IS NOT NULL DROP TABLE #TABLE1
    IF OBJECT_ID('tempdb..#TABLE2') IS NOT NULL DROP TABLE #TABLE2

    CREATE TABLE #TABLE1
    (
        CODE_NAME_T1 NVARCHAR(20)
    )

    CREATE TABLE #TABLE2
    (
        CODE_NAME_T2 NVARCHAR(20)
    )

    INSERT INTO #TABLE1(CODE_NAME_T1)
    VALUES             ('BBX123')
                      ,('BC/230')
                      ,('1AC030')
                      ,('BB01BC')           

    INSERT INTO #TABLE2(CODE_NAME_T2)
    VALUES             ('BB')
                      ,('BC')

    SELECT T1.CODE_NAME_T1, T2.CODE_NAME_T2
    FROM #TABLE1 T1
    LEFT OUTER JOIN #TABLE2 T2
    ON T1.CODE_NAME_T1 LIKE '%' + T2.CODE_NAME_T2 + '%'

    IF OBJECT_ID('tempdb..#TABLE1') IS NOT NULL DROP TABLE #TABLE1
    IF OBJECT_ID('tempdb..#TABLE2') IS NOT NULL DROP TABLE #TABLE2

RESULT

CODE_NAME_T1   |    CODE_NAME_T2
---------------|-----------------
BBX123         |     BB
BC/230         |     BC
1AC030         |     NULL
BB01BC         |     BB
BB01BC         |     BC

嗨,在上面的代码中我在join中使用了通配符。我在结果中面临的问题" BB01BC"行出现两次,因为它包含" BB"和" BC"字符。有没有办法只出现一次。所以如果" BB"匹配在" BB01BC"然后它不应该寻找" BC"在里面?基本上只进行一次匹配/查找而不进行更多的匹配/查找?

2 个答案:

答案 0 :(得分:1)

以下是使用OUTER APPLY的一种方法:

SELECT T1.CODE_NAME_T1, T2.CODE_NAME_T2
FROM #TABLE1 T1 OUTER APPLY
     (SELECT TOP 1 t2.*
      FROM #TABLE2 T2
      WHERE T1.CODE_NAME_T1 LIKE '%' + T2.CODE_NAME_T2 + '%'
     ) T2;

注意:使用ORDER BY时,您几乎总是需要TOP。你似乎对{em>来自T2的行没有特别感兴趣,你只需要其中一行。如果您具有特定优先级,则添加ORDER BY以确定优先级。

答案 1 :(得分:0)

这似乎适用于您的情况: SELECT T1.CODE_NAME_T1, (SELECT TOP 1 T2.CODE_NAME_T2 from #TABLE2 T2 where T1.CODE_NAME_T1 LIKE '%' || T2.CODE_NAME_T2 || '%') FROM #TABLE1 T1