#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
Возвращаемый результат: