我有sql语句
LEFT JOIN SeniorCitizen on FinishedTransaction.SCID = SeniorCitizen.OSCAID
SCID有1234 OSCAID有1234/102938
如何删除/ 102938以使其匹配
答案 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,但是假设你不知道长度仍然更安全,因为可能在未来的某个时间长度增长。如果确实如此,您的查询可以随意扩展而没有任何问题。为此,您可以使用SUBSTRING
和CHARINDEX
的组合,如下所示:
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)
您可以使用LEFT
或SUBSTRING
功能执行此操作。
SUBSTRING(SeniorCitizen.OSCAID, 1, 4)
LEFT(SeniorCitizen.OSCAID, 4)
但请记住,使用用户定义的函数可能会使查询无法进行查询。