Sql 最长字符串匹配

Sql 最长字符串匹配,sql,sql-server,pattern-matching,Sql,Sql Server,Pattern Matching,我运行一个UPDATE语句,基于另一个表的连接来识别和添加正确的“目标”代码 下面是我的代码 UPDATE [BILLING] SET [BILLING].[BILLDESTINATION] = [Orbisrates].[dbo].[RATES].[DESTINATION] FROM [OrbisRates].[dbo].[RATES] INNER JOIN [OrbisBilling].[dbo].[BILLING] ON [Or

我运行一个UPDATE语句,基于另一个表的连接来识别和添加正确的“目标”代码

下面是我的代码

UPDATE [BILLING] 
SET    [BILLING].[BILLDESTINATION] = [Orbisrates].[dbo].[RATES].[DESTINATION] 
FROM   [OrbisRates].[dbo].[RATES] 
       INNER JOIN [OrbisBilling].[dbo].[BILLING] 
               ON [OrbisBilling].[dbo].[BILLING].[TO] LIKE 
                  [RATES].[DESTINATION] + ''%'' 
我大部分工作都是因为匹配不正确

以下是我的目的地列表中的示例代码

1
100
1001
问题是电话号码1001999返回100作为目的地,因为我需要它匹配最长的正确匹配,所以我希望它返回1001

匹配最长/最佳匹配的正确语法是什么

非常感谢您的帮助

编辑-完整代码在这里

DECLARE @tablevalue NVARCHAR(MAX), @sql NVARCHAR(MAX); 

DECLARE table_value_cursor CURSOR FOR
    SELECT DISTINCT [Tariff Lookup] 
    FROM [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325]; OPEN table_value_cursor  
    FETCH NEXT FROM table_value_cursor INTO @tablevalue WHILE @@FETCH_STATUS = 0  
    BEGIN SELECT @sql = N'

        UPDATE [masked_2014-06-30-2014-06-01-customer325] 
        SET [masked_2014-06-30-2014-06-01-customer325].[Sell Price] = 
        (CASE WHEN (DATEPART(hh,[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ConnectTime]) >= 8 AND DATEPART(hh,[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ConnectTime]) <= 17)
        THEN ROUND ([Orbisrates].[dbo].[Orbis_Import_June2014].[Peakperminute]/60*[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ChargedTimeSecs]+[Orbisrates].[dbo].[Orbis_Import_June2014].[Peakconnect],4)
        ELSE ROUND ([Orbisrates].[dbo].[Orbis_Import_June2014].[OffPeakperminute]/60*[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ChargedTimeSecs]+[Orbisrates].[dbo].[Orbis_Import_June2014].[OffPeakconnect],4)
        END)
        FROM [OrbisRates].[dbo].'+ @tablevalue +'
        INNER JOIN [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325] on [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[To] LIKE '+ @tablevalue +'.[Destination]+ ''%''
        WHERE [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[tariff lookup] = '''+ @tablevalue +'''';

EXEC sp_executesql @sql; 
FETCH NEXT FROM table_value_cursor 
INTO @tablevalue; 
END CLOSE table_value_cursor 
DEALLOCATE table_value_cursor;
声明@tablevalue-NVARCHAR(MAX)、@sql-NVARCHAR(MAX);
声明表\u值\u光标
选择DISTINCT[关税查找]
来自[OrbisBilling]。[dbo]。[masked_2014-06-30-2014-06-01-customer325];打开表\u值\u光标
在@FETCH\u STATUS=0时,将下一个从表\u value\u光标提取到@tablevalue
开始选择@sql=N'
更新[masked_2014-06-30-2014-06-01-customer325]
套装[masked_2014-06-30-2014-06-01-customer325]。[售价]=

(当DATEPART(hh,[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ConnectTime])>=8和DATEPART(hh,[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ConnectTime])这是用别名重写的查询,以便更容易阅读(至少对我来说):

您遇到的问题是多个匹配项。解决此问题的一种方法是使用子查询:

UPDATE b
    SET BillDestination = (SELECT TOP 1 r.Destination
                           FROM OrbisRates.dbo.Rates r
                           WHERE b.[To] LIKE r.Destination + '%'
                           ORDER BY LEN(r.Destination) DESC
                          ) 
    FROM OrbisBilling.dbo.Billing b;

谢谢@Gordon Linoff。我之前简化了我的代码,以便更容易阐明我的问题-您的解决方案看起来会起作用,使用子查询对数字DESC等进行排序。但我不确定如何在我的代码上下文中使用。我能摆脱我的JOIN吗?非常感谢语法方面的任何帮助。我已经添加了完整的代码a博韦。Thanks@user3580480…您应该去掉连接并将该逻辑移动到子查询中。
UPDATE b
    SET BillDestination = (SELECT TOP 1 r.Destination
                           FROM OrbisRates.dbo.Rates r
                           WHERE b.[To] LIKE r.Destination + '%'
                           ORDER BY LEN(r.Destination) DESC
                          ) 
    FROM OrbisBilling.dbo.Billing b;