SQL Выбор символьной строки между несколькими символами, не константой - PullRequest
0 голосов
/ 09 октября 2018

Мой SUBSTRING / CHARINDEX запрос прервался несколько ночей назад, и я пытаюсь понять, почему.Я пытаюсь выбрать символы (Дата) между «Appt. Date:» и «Appt. Time:» в комментариях, например:

Status: Future Appointment  Appt. Date:12/14/18  Appt. Time:9:30am
Status: Obtaining Results  Appt. Date:10/05/18  Appt. Time:4:00
Status:   Appt. Date:8/28/2018  Appt. Time: 9:15am

Используя этот запрос:

select ltrim(
            rtrim(
                SUBSTRING([Order Comments], 
                      CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:'), 
                      CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date:', [Order Comments])) - 
                          (CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:'))
                 )
            )
        ) as 'OrderApptDate'
FROM [HIRS_Tools].[dbo].[OMT_BOD]
WHERE [Order Comments] like 'status:%'

Ошибка SQL:

Недопустимая длина параметра, переданного в функцию LEFT или SUBSTRING.

Должен ли я использовать другой подход к выбору символов даты или простопроблема с моим текущим запросом?Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 12 октября 2018

Во-первых, большое спасибо всем за сообщения.Хотя никто из них не дал мне точного ответа, все они дали мне кусочек, чтобы ответить на загадку.Особенно HABO и 3N1GM4!

В конце концов я обнаружил, что поля Appt Date и Appt Time не всегда совпадают.Существуют комбинации Appt.Дата: & Appt.Время, Appt.Дата - & Appt.Время, Appt Дата и Appt.Время ... Все обнаружено из выражения длины поля HABO.Итак, я добавил оператор case для каждой длины поля комбо [Appt Date / Appt Time].Это решило все проблемы и дало мне достаточно рычагов, чтобы мои пользователи очистили оставшиеся записи и внедрили лучший рабочий процесс ввода данных.

Новый запрос выглядит так:

select
 case 
  when CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date:', [Order Comments])) - (CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:')) <15
  and [Type]='Procedure' AND [Order Comments] like 'status:%' and [Order Comments] like '%Appt. Time%'
       then ltrim(rtrim(SUBSTRING([Order Comments], CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:'), CHARINDEX('Appt. Time:',[Order Comments], CHARINDEX('Appt. Date:', [Order Comments])) - (CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:')))))
  when CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date:', [Order Comments])) - (CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:')) <15
  and [Type]='Procedure' AND [Order Comments] like 'status:%' and [Order Comments] like '%Appt Time%'
       then ltrim(rtrim(SUBSTRING([Order Comments], CHARINDEX('Appt Date:', [Order Comments]) + LEN('Appt Date:'), CHARINDEX('Appt Time:',[Order Comments], CHARINDEX('Appt Date:', [Order Comments])) - (CHARINDEX('Appt Date:', [Order Comments]) + LEN('Appt Date:')))))
  when (CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date -', [Order Comments])) - (CHARINDEX('Appt. Date -', [Order Comments]) + LEN('Appt. Date -'))) <15
  and [Type]='Procedure' AND [Order Comments] like 'status:%' and [Order Comments] like '%Appt. Date -%'
       then ltrim(rtrim(SUBSTRING([Order Comments], CHARINDEX('Appt. Date -', [Order Comments]) + LEN('Appt. Date -'), CHARINDEX('Appt. Time:',[Order Comments], CHARINDEX('Appt. Date -', [Order Comments])) - (CHARINDEX('Appt. Date -', [Order Comments]) + LEN('Appt. Date -')))))
  when (CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date ', [Order Comments])) - (CHARINDEX('Appt. Date ', [Order Comments]) + LEN('Appt. Date '))) <15
  and [Type]='Procedure' AND [Order Comments] like 'status:%' and [Order Comments] like '%Appt. Date %'
       then ltrim(rtrim(SUBSTRING([Order Comments], CHARINDEX('Appt. Date ', [Order Comments]) + LEN('Appt. Date '), CHARINDEX('Appt. Time:',[Order Comments], CHARINDEX('Appt. Date ', [Order Comments])) - (CHARINDEX('Appt. Date ', [Order Comments]) + LEN('Appt. Date ')))))
       else [Date - Due] end as 'OrderApptDate'

FROM [HIRS_Tools].[dbo].[OMT_BOD]
WHERE ([Order Comments] like 'status:%')

СноваСпасибо за помощь, и я надеюсь, что кто-то найдет это полезным в будущем.

...