Как поместить оператор CASE в оператор SUBSTRING?

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

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

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

declare @ReportParameter1 nvarchar(16)
set @ReportParameter1 = '[email protected]'
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))

person dotnetN00b    schedule 28.11.2011    source источник
comment
Вы неправильно используете функцию SUBSTRING в предложении WHERE. Вы используете его так, как будто ожидаете, что он вернет истину / ложь. Разве вы не хотите приравнять это к чему-то (например: SUBSTRING (.....) = 'abc')?   -  person Keith    schedule 28.11.2011
comment
Весь код, относящийся к подстроке, в порядке, кроме последнего AND () в предложении WHERE, вы должны поставить рядом с ним какое-то логическое условие   -  person sll    schedule 28.11.2011
comment
Это было первой частью моей проблемы. То, что у меня есть сейчас, и есть настоящая проблема. Я должен сначала опубликовать это. Мои извинения. Я оценил всех за их ответы. Еще раз спасибо.   -  person dotnetN00b    schedule 28.11.2011


Ответы (2)


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

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

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

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

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

... 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
person Guffa    schedule 28.11.2011
comment
Вы абсолютно правы. копирование и вставка - это работа дьявола. - person dotnetN00b; 29.11.2011
comment
Похоже, я пришел к тому же ответу, что и вы. Хотя у вас надежнее. В любом случае вы получите чек. - person dotnetN00b; 29.11.2011
comment
Это именно то, что я говорил ... однако, спасибо Гуффе за то, что он выдал полный ответ! - person John Sobolewski; 29.11.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
person John Sobolewski    schedule 28.11.2011
comment
Вопрос был в том ... Как мне поместить оператор CASE в оператор SUBSTRING? ... есть вторичная проблема, заключающаяся в том, что в его предложении where отсутствует логическое выражение. Я хотел сказать, что ему не нужно указывать регистр в подстроке ... Я ответил на заданный вопрос ... а не на проблему с вопросом. хм ... может мы просто коснемся волос. - person John Sobolewski; 28.11.2011
comment
Нет, это заголовок, но, честно говоря, заголовок выглядит как полный вопрос, хотя это не должно быть, и вопрос на самом деле не содержит вопроса ... - person Guffa; 28.11.2011