SQL-запрос для получения n-го вхождения подчеркивания из строки - PullRequest
0 голосов
/ 23 мая 2019

Мне нужно получить слово из строки, разделенной подчеркиванием и внутренним соединением, с другим столбцом таблицы, чтобы получить уникальные данные.

Я попытался создать хранимую процедуру и функцию, однако это занимает больше4 минуты для получения данных, тогда как если я выполняю обычный запрос на выборку таблицы, это занимает 1 секунду, я полагаю, что моя функция выполняет полное сканирование таблицы каждый раз.

Create PROCEDURE [dbo].[SP_GetTicketWeekly]
(   
    @P_skip int,
    @P_pageSize int,
    @P_Count int output 
)
AS
BEGIN   
    Select  d.TicketNumber as 'CouponID' , 
    SUBSTRING(CAST(d.TicketNumber AS varchar(38)), 11, 5) as 'PromoCode',  
    d.PromoStartDate as 'CouponStartDateID', 
    d.PromoEndDate as 'CouponEndDateID', 
    d.Description as 'CouponDesc',
    case 
    When d.PromoType in (0, 1) and dbo.ParsePart(d.Description, '_', 1) =a.value and (d.Description like 'ZV_%') 
    then a.description
    When d.PromoType = 1 and dbo.ParsePart(d.Description, '_', 1) =a.value
    then  ( CAST(d.PromoValue AS VARCHAR)+ '% ' + a.description )
    When d.PromoType = 0 and dbo.ParsePart(d.Description, '_', 1) = a.value then  ('$' + CAST(PromoValue AS VARCHAR)+' '+ a.description )
    end as 'Offer Description',
    SUBSTRING(CAST(TicketNumber AS varchar(38)), 8, 3) as 'Discount Amount', 
    d.PromoLevel as 'ItemTrans1', 
    --SUBSTRING(CAST(TicketNumber AS varchar(38)),5,1) as 'ItemTrans',
    d.PromoType as 'DollarPercent',
    --SUBSTRING(CAST(TicketNumber AS varchar(38)),7,1) as 'DollarPercent', 
    dbo.ParsePart(d.Description, '_', 2) as 'ChannelDesc',
    dbo.ParsePart(d.Description, '_', 3) as 'EventDesc' ,
    case 
    when dbo.ParsePart(d.Description, '_', 5) is NULL then
    dbo.ParsePart(d.Description, '_', 4)
    ELSE
    CONCAT(dbo.ParsePart(d.Description, '_', 4),'_',dbo.ParsePart(d.Description, '_', 5))
    END as 'AttDesc' 
    from [dbo].[Product] d
    inner join [dbo].[ProductDescription] a on dbo.ParsePart(d.Description, '_', 1) = a.value
    --where d.promoStartDate > 20140000 
    ORDER BY d.promoStartDate   OFFSET '' + @P_skip + '' ROWS Fetch NEXT '' + @P_pageSize + '' ROWS ONLY 
END

Create Function [dbo].[ParsePart]
    (
    @Data varchar(8000),
    @Delimiter VarChar(8000),
    @Index Int
    )
Returns VarChar(8000)
As
Begin
    Return (Select FieldName From dbo.Split(@Data, @Delimiter) Where Position = @Index)
End


Create Function [dbo].[Split]
    (
    @CommaDelimitedFieldNames Varchar(8000), 
    @CharToFind VarChar(10) 
    ) 
Returns @Tbl_FieldNames Table (Position Integer Identity(1,1), FieldName VarChar(8000)) As 
Begin 
 Set @CommaDelimitedFieldNames = @CommaDelimitedFieldNames + @CharToFind
 Declare @Pos1 Int
 Declare @pos2 Int

 Set @Pos1=1
 Set @Pos2=1
 While @Pos1<DataLength(@CommaDelimitedFieldNames)
 Begin
 Set @Pos1 = CharIndex(@CharToFind, @CommaDelimitedFieldNames,@Pos1)
 Insert @Tbl_FieldNames Select Cast(Substring(@CommaDelimitedFieldNames,@Pos2,@Pos1-@Pos2) As VarChar(8000))
 Set @Pos2=@Pos1+1
 Set @Pos1 = @Pos1+1
 End 
 Return
End


TABLE 1

Column1   Column2
RSCL    off Reg Sale or Clearance Item  

TABLE2

Description              Column2
SA_ALL_PS_RSCL_CL        SAMPLE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...