У меня есть запрос в SQL Server 2012 , который занимает 8 секунд, чтобы получить 1158 строк. В запросе, который мне нужно объединить на двух полях, я должен обрезать начальные и конечные 0 при объединении.
ниже запроса: для получения 1158 строк требуется 8 секунд
Select value1, value2
from TableA LEFT JOIN TableB
ON
SUBSTRING(REVERSE(SUBSTRING(REVERSE(TableA.[policy#]),PATINDEX('%[^' + '0' + ' ]%',REVERSE(TableA.[policy#])),100)),PATINDEX('%[^' + '0' + ' ]%',REVERSE(SUBSTRING(REVERSE(TableA.[policy#]),PATINDEX('%[^' + '0' + ' ]%',REVERSE(TableA.[policy#])),100))),100)
= SUBSTRING(REVERSE(SUBSTRING(REVERSE(TableB.[policy#]),PATINDEX('%[^' + '0' + ' ]%',REVERSE(TableB.[policy#])),100)),PATINDEX('%[^' + '0' + ' ]%',REVERSE(SUBSTRING(REVERSE(TableB.[policy#]),PATINDEX('%[^' + '0' + ' ]%',REVERSE(TableB.[policy#])),100))),100)
WHERE {some conditions}
Вместо того, чтобы писать некрасивый код для удаления начальных и конечных нулей, я создал две функции, которые делают то же самое
ALTER FUNCTION [dbo].[L_TRIM](@String VARCHAR(MAX), @Char varchar(5))
RETURNS VARCHAR(MAX)
BEGIN
RETURN SUBSTRING(@String,PATINDEX('%[^' + @Char + ' ]%',@String),100)
END
ALTER FUNCTION [dbo].[R_TRIM](@String VARCHAR(MAX), @Char varchar(5))
RETURNS VARCHAR(MAX)
BEGIN
RETURN REVERSE(SUBSTRING(REVERSE(@String),PATINDEX('%[^' + @Char + ' ]%',REVERSE(@String)),100))
END
Ниже запроса: для получения 1158 строк требуется 1 минута 40 секунд
Select value1, value2
from TableA LEFT JOIN TableB
ON
dbo.L_trim(dbo.R_trim( TableA.[policy#], '0'),'0') = dbo.L_trim(dbo.R_trim(TableB.[policy#], '0'),'0')
WHERE {some conditions}
Может ли кто-нибудь подсказать мне, как я могу извлечь строки за меньшее время без написания некрасивого кода?