如何在SQL中替换左连接语句中的一部分字符串

时间:2015-11-26 03:38:49

标签: sql sql-server left-join

我有sql语句

 LEFT JOIN SeniorCitizen on FinishedTransaction.SCID = SeniorCitizen.OSCAID

SCID有1234 OSCAID有1234/102938

如何删除/ 102938以使其匹配

3 个答案:

答案 0 :(得分:3)

嗯,一种方法是使用LIKE

ON SeniorCitizen.OSCAID LIKE FinishedTransaction.SCID + '/%'

不保证性能,但这应该正确地执行join

编辑:

您可以通过使用计算列然后使用计算列上的索引来有效地执行此操作。

所以:

alter table SeniorCitizen
    add OSCAIDshort as ( cast(left(OSCAID, CHARINDEX('/', OSCAID) - 1) as int) );

create index idx_SeniorCitizen_OSCAIDshort on SeniorCitizen(OSCAIDshort);

(演员认为SCID列是一个整数。)

然后你可以在联接中使用它:

LEFT JOIN SeniorCitizen on FinishedTransaction.SCID = SeniorCitizen.OSCAIDshort

此公式可以使用计算列上的索引,因此可能是执行join的最快方法。

答案 1 :(得分:1)

如果你知道你所比较的数字的长度总是4,你可以使用SUBSTRING,如下所示:

LEFT JOIN SeniorCitizen on FinishedTransaction.SCID = SUBSTRING(SeniorCitizen.OSCAID, 1, 4)

只需抓取OSCAID中的前四个字符进行比较。

然而,即使你知道长度总是4,但是假设你不知道长度仍然更安全,因为可能在未来的某个时间长度增长。如果确实如此,您的查询可以随意扩展而没有任何问题。为此,您可以使用SUBSTRINGCHARINDEX的组合,如下所示:

LEFT JOIN SeniorCitizen on FinishedTransaction.SCID = SUBSTRING(SeniorCitizen.OSCAID, 1, CHARINDEX('/', SeniorCitizen.OSCAID, 0))

这将从OSCAID中的第一个字符开始,并继续阅读,直至找到/。因此,如果字符串为1234/102938,则会返回1234。如果增长到123456/102938,它将返回123456

请务必查看每个功能的文档,以便更好地了解其功能:

SUBSTRING: https://msdn.microsoft.com/en-us/library/ms187748.aspx

CHARINDEX: https://msdn.microsoft.com/en-us/library/ms186323.aspx

答案 2 :(得分:0)

您可以使用LEFTSUBSTRING功能执行此操作。

SUBSTRING(SeniorCitizen.OSCAID, 1, 4)

LEFT(SeniorCitizen.OSCAID, 4)

但请记住,使用用户定义的函数可能会使查询无法进行查询。