【问题标题】:SQL Server match and get correct value from second tableSQL Server 匹配并从第二个表中获取正确的值
【发布时间】:2016-10-11 11:28:31
【问题描述】:
        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')
                          ,('B/X230')
                          ,('1BC030')
                          ,('BB01BC')
                          ,('BN01BB')           

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

        --SELECT 1
        SELECT T1.CODE_NAME_T1
            ,'CODE_NAME_T2' = (SELECT TOP 1 T2.CODE_NAME_T2 
                               FROM #TABLE2 T2 
                               WHERE T1.CODE_NAME_T1 LIKE '%' + T2.CODE_NAME_T2 + '%')
        FROM #TABLE1 T1

        --SELECT 2
        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

结果

选择 1

CODE_NAME_T1   |    CODE_NAME_T2
---------------|----------------
BBX123         |    B
B/X230         |    B
1BC030         |    B
BB01BC         |    B
BN01BB         |    B

选择 2

CODE_NAME_T1   |    CODE_NAME_T2
---------------|----------------
BBX123         |    B
BBX123         |    BB
B/X230         |    B
1BC030         |    B
BB01BC         |    B
BB01BC         |    BB
BN01BB         |    B
BN01BB         |    BB

在上面的代码中,我试图从#TABLE2 的第二列中获取正确的值,并尝试了两种 SELECT 方法,但没有得到我想要的结果。

问:
基本上我需要的代码应该在#TABLE1 值中查找,如果任何字符出现一次或两次,那么它应该从#TABLE2 中带来正确的值。就像上面第二列的第一个结果一样,所有值都是“B”,但对于“BBX123”应该是“BB”,因为这里“B”字符出现了两次,对于“B/X230”它应该是“B”,因为这里“ B”字符出现一次。

所以完整的结果应该是。

需要结果

CODE_NAME_T1   |    CODE_NAME_T2
---------------|----------------
BBX123         |    BB
B/X230         |    B
1BC030         |    B
BB01BC         |    BB
BN01BB         |    BB

有什么方法可以实现吗?我需要做某种字符计数吗?

注意-这里的“B”字符是一个示例,因为它可以是在#TABLE1 中出现一次或两次的任何字符

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

你可以像这样使用查询

select CODE_NAME_T1, 
case  when charindex('BB', code_name_t1)>0 then 'BB' 
      when (charindex('B',CODE_NAME_T1)>0 and charindex('BB', code_name_t1)=0) then 'B' else NULL end as 'B'
 from #TABLE1

然后您可以加入您的第二张桌子以获取其他详细信息

【讨论】:

  • Kannan - 感谢您的回答,但正如我在问题中提到的那样,“B”只是一个示例,因为它可以是任何字符。我需要一些动态的方法。
  • 提供更多输入数据并尝试正则表达式,它适用于这样的模式...在这种情况下,您可以使用 PatIndex msdn.microsoft.com/en-us/library/ms188395.aspx
【解决方案2】:

按 len() 排序得到最长匹配

    SELECT T1.CODE_NAME_T1
        ,'CODE_NAME_T2' = (SELECT TOP 1 T2.CODE_NAME_T2 
                           FROM #TABLE2 T2 
                           WHERE T1.CODE_NAME_T1 LIKE '%' + T2.CODE_NAME_T2 + '%'
                           ORDER BY len(T2.CODE_NAME_T2) DESC)
    FROM #TABLE1 T1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多