Разделение предложения и выбор только требуемой строки в sql

#sql-server #tsql #sql-function

#sql-сервер #tsql #sql-функция

Вопрос:

В моей таблице есть столбец с именем billing_cycle, который содержит только указанные ниже две строки, и мне нужно извлекать из этой строки только ежемесячно и ежеквартально.

Используя приведенный ниже запрос, я могу правильно извлекать строку ежеквартально, но не строку ежемесячно.В поле out поместите слово A, совпадающее со строкой Monthly.Это можно заменить с помощью команды case и stuff, но я не хочу их использовать. Я хотел бы получить выходные данные, используя substring и charindex или любую другую функцию.

 SELECT substring('208-Billing Period - Quarterly Average Daily Balance', charindex('- ', '208-Billing Period - Quarterly Average Daily Balance')   2, 9)


SELECT substring('210-Billing Period - Monthly Average Daily Balance', charindex('- ', '210-Billing Period - Monthly Average Daily Balance')   2, 9)
  

Кто-нибудь может мне помочь?

Комментарии:

1. С чем вам нужна помощь? Что не работает в приведенном выше SQL? Каких результатов вы ожидаете?

2. ожидаемый результат заключается в том, что он будет отображать только monthly вместо monthly A.

3. Заменить 9 на 7 в вашем втором запросе?

4. Привет, Ларну, спасибо за твое предложение. На самом деле мне нужно использовать этот запрос для столбца, и этот столбец содержит только эти две строки ‘208-Расчетный период — Среднеквартальный ежедневный баланс’ И ‘210-Расчетный период — Среднемесячный ежедневный баланс’, поэтому мне нужно использовать только один запрос для извлечения данных из этого столбца. Если я поставлю 7, как вы сказали, тогда слово «ежеквартально» не будет отображаться должным образом. надеюсь, вы меня поняли!!

5. Приведенные выше строки являются буквальными, а не столбцом. Итак, вы получаете эти данные из таблицы вместо этого?

Ответ №1:

Одним из методов было бы использование пары вложенных CHARINDEX функций. Я делаю это FROM , поскольку это позволяет избежать повторения выражений:

 SELECT SUBSTRING(V.YourColumn,CI1.I, CI2.I - CI1.I)
FROM (VALUES('208-Billing Period - Quarterly Average Daily Balance'),('210-Billing Period - Monthly Average Daily Balance'))V(YourColumn)
     CROSS APPLY (VALUES(CHARINDEX('- ',V.YourColumn) 2))CI1(I)
     CROSS APPLY (VALUES(CHARINDEX(' ',V.YourColumn,CI1.I)))CI2(I);
  

Комментарии:

1. Конечно, вы хотели бы сделать то же самое со своим вопросом, @Rajeev? Если нет, вы должны быть в состоянии легко разобраться, как изменить имена столбцов, я удачно назвал это » YourColumn »

Ответ №2:

Я рекомендую вам использовать like и a case для упрощения этого, чтобы вам не приходилось жестко кодировать конкретные значения позиций в substring

   select
    case when v.Value like '%Monthly%'
        then 'Monthly'
        when v.Value like '%Quarterly%'
        then 'Quarterly'
    end as [Type],
    v.Value
from (
    select '210-Billing Period - Monthly Average Daily Balance' as [Value]
    union select '208-Billing Period - Quarterly Average Daily Balance'
) V
  

Результаты:

Результаты

Ответ №3:

Намного проще использовать CASE / LIKE и т.д., Но поскольку вы не собираетесь их использовать (это домашнее задание?), Вместо 9 в конце substring() вам придется использовать позицию — 1 следующего пробела после слова Quarterly или Monthly. Я оставил несколько дополнительных столбцов, чтобы помочь вам понять это.

 declare @test table
(
ID int identity(1,1)
,Billing varchar(100)
)

insert into @test(Billing)
select '208-Billing Period - Quarterly Average Daily Balance' UNION
select '210-Billing Period - Monthly Average Daily Balance'

select * 
,charindex('- ', Billing)   2 position_of_first_dash
,substring(Billing, charindex('- ', Billing)   2, LEN(Billing)) substring_from_first_dash_pos_plus_2
,charindex(' ', substring(Billing, charindex('- ', Billing)   2, LEN(Billing))) pos_first_space_after_dash_word
,substring(Billing, charindex('- ', Billing)   2, charindex(' ', substring(Billing, charindex('- ', Billing)   2, LEN(Billing)))-1 )
from 
@test
  

Возвращаемый результат:

введите описание изображения здесь