SQL Server Query - разбить строку на 3 части на основе 2 разных общих разделителей

Я пытаюсь создать запрос, который может разделить описания, цвета и размеры товара на отдельные значения. У меня есть таблица, полная описания продуктов, цветов и размеров. Некоторые описания продуктов содержат цвет и размер, каждый из которых ограничен определенной строкой. Некоторые цвета и размеры содержатся в собственных столбцах. Часто столбцы description и color/size содержат значения color/size. Общее описание продукта в сочетании с цветом и размером будет выглядеть следующим образом: ProductDescription..-..Color--.-- Размер, где цвет ограничивается "..-..", а размер - "--.-- ". Иногда цвет и / или размер не существуют, и в запросе нет разделителя, но я все же хочу разделить описание / цвет или описание / размер или просто вернуть описание и пустые значения для цвета / размера, когда ни существует...

Описание и размер разделены просто отлично, но у меня проблемы с цветом. Я получаю следующую ошибку:

Invalid length parameter passed to the LEFT or SUBSTRING function.

Любая помощь приветствуется!

Вот то, что у меня пока что не работает:

Select
    Ps.ID
    ,Case
        When Ps.ColorStart <= 5 And Ps.SizeStart <= 5 Then Ps.Description
        When Ps.ColorStart <= 5 And Ps.SizeStart > 5 Then Left(Ps.Description, Ps.SizeStart - 6)
        When Ps.ColorStart > 5 Then Left(Ps.Description, Ps.ColorStart - 6)
        Else Ps.Description
    End As DescriptionWithoutColorAndSize

    ,Case
        When Ps.PColor Is Not Null And Ps.PColor <> '' Then Ps.PColor
        When Ps.ColorStart <= 5 Or Ps.Description Is Null Or Ps.Description = '' Then ''
        When Ps.SizeStart <= 5 And Ps.ColorStart > 5 Then SUBSTRING(Ps.Description, Ps.ColorStart, 299)
        When Ps.SizeStart > 5 And Ps.ColorStart > 5 Then SUBSTRING(Ps.Description, Ps.ColorStart, Ps.ColorEndIfSizeExists - Ps.ColorStart + 1)
            --The prior line is what fails
        Else ''
    End As Color


    ,Case
        When Ps.PSize Is Not Null And Ps.PSize <> '' Then Ps.PSize
        When Ps.SizeStart <= 5 Then ''
        Else SUBSTRING(Ps.Description, Ps.SizeStart, 299)
    End As Size

From
    (
    Select
        P.ID
        ,P.Description
        ,P.Color As PColor
        ,P.Size As PSize
        ,CHARINDEX('..-..',P.Description,0) + 5 As ColorStart
        ,CHARINDEX('--.--',P.Description,0) -1 As ColorEndIfSizeExists
        ,Len(P.Description) As ColorEndIfSizeDoesNotExist
        ,CHARINDEX('--.--',P.Description,0) + 5 As SizeStart

    From
        MYProductsTable P
    ) Ps

1 ответ

Решение

Все проблемы были связаны со следующим описанием дела:

,Case
    When Ps.PColor Is Not Null And Ps.PColor <> '' Or Ps.ColorEndIfSizeExists - Ps.ColorStart + 1 < 0 Then Ps.PColor
    When Ps.ColorStart <=5 Or Ps.Description Is Null Or Ps.Description = '' Then ''
    When Ps.SizeStart <=5 And Ps.ColorStart > 5 Then SUBSTRING(Ps.Description, Ps.ColorStart, 299)
    When Ps.SizeStart > 5 And Ps.ColorStart > 5 Then SUBSTRING(Ps.Description, Ps.ColorStart, Ps.ColorEndIfSizeExists - Ps.ColorStart + 1)

    Else ''
End As Color

Я изменил все экземпляры с "<=5" на "<6" и добавил новое "Когда" в устав:

    ,Case
        When Ps.ColorEndIfSizeExists - Ps.ColorStart + 1 < 0 Then SUBSTRING(Ps.Description, Ps.ColorStart, 299)
        When Ps.PColor Is Not Null And Ps.PColor <> '' Then Ps.PColor
        When Ps.ColorStart <6 Or Ps.Description Is Null Or Ps.Description = '' Then ''
        When Ps.SizeStart <6 And Ps.ColorStart > 5 Then SUBSTRING(Ps.Description, Ps.ColorStart, 299)
        When Ps.SizeStart > 5 And Ps.ColorStart > 5 Then SUBSTRING(Ps.Description, Ps.ColorStart, Ps.ColorEndIfSizeExists - Ps.ColorStart + 1)
        Else ''
    End As Color

И это решило проблему. Я не знаю почему... Если кто-то знает, пожалуйста, не стесняйтесь объяснять! Спасибо за весь вклад.

Другие вопросы по тегам