Tsql: поиск нескольких полей в строке для заданного набора строковых значений
У меня возникают проблемы, когда я решаюсь над следующей проблемой, связанной с отчетом об общих продажах по рекламным акциям достаточно общим образом, чтобы я мог обрабатывать обычные запросы пользователей через подписку. (или даже позволить пользователям получать данные по запросу)
Я пытаюсь написать запрос для отчета SSRS, который будет принимать входные данные из текстового параметра, который допускает множественные значения. Пример ("Код1, Код2, Код3")… и затем ищет все четыре поля "ID продажи" в приведенной ниже таблице примера - возвращает каждую комбинацию [DocumentNo], [LineNo_], где любой из предоставленных кодов появляется в любом из ID поля. Четыре поля не могут быть пустыми, но они могут быть пустой строкой. Можно применить более одного кода к строке заказа, но только один в каждом поле. Каждая комбинация [DocumentNo], [LineNo_] должна появляться только один раз в выходных данных, чтобы я мог суммировать [кол-во] и получать правильную сумму.
[DocumentNo] [varchar](20) NOT NULL
[LineNo_] [int] NOT NULL
[SalesDiscountReasonID] [varchar](20) NOT NULL
[CouponID] [varchar](30) NOT NULL
[CampaignID] [varchar](20) NOT NULL
[PromotionCodeID] [varchar](20) NOT NULL
[qty] [Int] NOT NULL
Я не могу изменить структуру данных в хранилище данных и не могу ожидать, что пользователи, которые регулярно запрашивают этот отчет, будут отслеживать, какой тип продвижения Купон, Campaign, SalesDiscount, PromoCode использовался для реализации продажи, поскольку они не t настроить Продажи или сделать ввод данных заказов.
1 ответ
Я думаю, что вы можете делать то, что вы хотите с like
:
where (','+@Codes+',' like '%,'+SalesDiscountReasonID+',%' or
','+@Codes+',' like '%,'+CouponID+',%' or
','+@Codes+',' like '%,'+CampaignID+',%' or
','+@Codes+',' like '%,'+PromotionCodeID+',%'
)
Дополнительная запятая используется, чтобы избежать путаницы между, скажем, 10
а также 100
,
Если вы создаете SQL, это намного, намного, намного лучше сделать:
where SalesDiscountReasonID in (''' + replace(@Codes, ',', ''',''') + ''') or
CouponID in (''' + replace(@Codes, ',', ''',''') + ''') or
CampaignID in (''' + replace(@Codes, ',', ''',''') + ''') or
PromotionCodeID in (''' + replace(@Codes, ',', ''',''') + ''')'
Одна из причин в том, что in
может использовать индексы и поэтому может работать намного лучше.