Как поместить оператор CASE в оператор SUBSTRING? - PullRequest
1 голос
/ 28 ноября 2011

Цель этого в том, что я пытаюсь сравнить имена пользователей двух адресов электронной почты и посмотреть, совпадают ли они. На самом деле, все, что я хочу, это чтобы это работало.

Когда я запускаю запрос, все, что я получаю, это: Неверный параметр длины, переданный в функцию LEFT или SUBSTRING.

Примечание: я изменил запрос. Это лучше иллюстрирует то, что я пытаюсь сделать. Примечание 2: Я внес изменения, чтобы они работали правильно, но теперь, если параметр равен '', тогда я получаю: Неверный параметр длины, переданный в функцию LEFT или SUBSTRING.

declare @ReportParameter1 nvarchar(16)
set @ReportParameter1 = 'manmoon@test1.com'
declare @ReportParameter2 nvarchar(16)
set @ReportParameter2 = ''
select 'test'
where SUBSTRING (case @ReportParameter1 when '' then 'x@' else @ReportParameter1 end, 1, Charindex('@', case @ReportParameter1 when '' then 'x@' else @ReportParameter1 end) - 1) = 
SUBSTRING (case @ReportParameter2 when '' then 'x@' else @ReportParameter2 end, 1, Charindex('@', case @ReportParameter2 when '' then 'x@' else @ReportParameter2 end) - 1)

Вот предложение where, которое я использовал для решения проблемы. Однако это научит меня быть более осторожным при копировании и вставке.

WHERE (substring(@ReportParameter1, 1, case when (CHARINDEX('@', @ReportParameter1) - 1) < 1 then 1 else CHARINDEX('@', @ReportParameter1) - 1 end) = SUBSTRING(@ReportParameter2, 1, CHARINDEX('@', @ReportParameter2) - 1))

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Ошибка возникает из-за того, что результат сравнения substring ни с чем не сравнивается. Строка не является логическим выражением.

Edit:

Теперь, когда вы отредактировали свой вопрос, этот ответ больше не имеет никакого смысла.

Я протестировал ваши выражения для подстрок с пустыми строками, и не получаю никакой ошибки. С другой стороны, если у вас есть строки, которые не являются пустыми, но не содержат символов @, вы получите ошибку, которую вы описали.

Чтобы справиться с этим, вы можете сделать так:

... where case
  when @ReportParameter1 = '' or charindex('@', @ReportParameter1) = 0 then 'x'
  else substring(@ReportParameter1, 1, charindex('@', @ReportParameter1) - 1)
end =
case
  when @ReportParameter2 = '' or charindex('@', @ReportParameter2) = 0 then 'x'
  else substring(@ReportParameter2, 1, charindex('@', @ReportParameter2) - 1)
end

Обратите внимание, однако, что две строки, которые не являются адресами электронной почты, будут сравниваться так же, как и 'x' = 'x', поэтому вы можете захотеть использовать разные запасные значения в выражениях ...

Редактировать 2:

Если подумать, вам не нужно проверять пустые строки, если вы проверяете символ @, так как пустая строка не может содержать символ @:

... where case
  when charindex('@', @ReportParameter1) = 0 then 'x'
  else substring(@ReportParameter1, 1, charindex('@', @ReportParameter1) - 1)
end =
case
  when charindex('@', @ReportParameter2) = 0 then 'x'
  else substring(@ReportParameter2, 1, charindex('@', @ReportParameter2) - 1)
end
2 голосов
/ 28 ноября 2011

поместите подстроку в регистр ... вам нужно статическое значение в одном регистре ... в другом ... используйте подстроку в регистре "else"

 case GPS_Quotes.[Sales Engineer] 
        when 
            '' then 'some constant value' 
        else 
            substring(GPS_Quotes.[Sales Engineer], 1, ...{I don't understand what your are trying to do})
        end
...