2015-05-28 2 views
0

Я пытаюсь использовать функцию RIGHT, чтобы получить подстроку значения, если она состоит из '/', но она не работает, когда Я добавляю номер к значению CHARINDEX; только без.SQL Server 2005 - RIGHT() не работает при добавлении в CHARINDEX()

Вот пример кода:

SELECT CASE 
      WHEN 
       CHARINDEX('/',REPLACE(ISNULL(d.target_grade,'NA'), 'N/A', 'NA')) = 0 
      THEN 
       REPLACE(ISNULL(d.target_grade,'NA'),'N/A','NA') 
      ELSE 
       RIGHT(d.target_grade, CHARINDEX('/',REPLACE(ISNULL(d.target_grade,'NA'), 'N/A', 'NA'))+1) 
     END as target_grade 
FROM tbl --etc. 

Это возвращает к примеру

target_grade 
------------- 
C/D 

Он должен вернуть хотя это

target_grade 
------------- 
D 

Если удалить +1, однако, функция RIGHT работает точно так, как должна

target_grade 
------------- 
/D 

Что я здесь делаю неправильно? Неужели моя логика испорчена?

+1

Ваша логика не так - 'charindex' отсчеты от ** осталось ** строки, но' right' отсчеты от ** ** справа от строки ... –

+0

Все ответы правильные, выбрал @PhilipKelley для указания дополнительных соображений. – RoyalSwish

ответ

2

Я рекомендую избегать чрезмерно сложных манипуляций струнных, усиливая силу CASE заявления. Попробуйте что-то вроде этого:

CASE 
    when d.target_grade is null then 'NA' 
    when d.target_grade = 'N/A' then 'NA' 
    when charindex('/', d.target_grade) = 0 then d.target_grade 
    else substring(d.target_grade, charindex('/', d.target_grade) + 1, XX) -- Replace XX with the max posssible length of d.target_grade 
END 
+0

Point взяв, спасибо. – RoyalSwish

0

С RIGHT хочет «сколько символов сохранить», а не «где начинать строку с», ваша текущая логика неверна.

Simpler, если у вас уже есть «где начать строку из» является использование SUBSTRING:

SELECT CASE 
      WHEN 
       CHARINDEX('/',REPLACE(ISNULL(d.target_grade,'NA'), 'N/A', 'NA')) = 0 
      THEN 
       REPLACE(ISNULL(d.target_grade,'NA'),'N/A','NA') 
      ELSE 
       SUBSTRING(d.target_grade, 
         CHARINDEX('/',REPLACE(ISNULL(d.target_grade,'NA'), 'N/A', 'NA'))+1 
          ,8000) 
     END as target_grade 
FROM tbl 
0

Глупый меня, как сказал @MarkBannister, charindex рассчитывает от оставил строки, но right подсчитывается с справа строки. Поэтому выше должен быть

SELECT CASE 
      WHEN 
       CHARINDEX('/',REPLACE(ISNULL(d.target_grade,'NA'), 'N/A', 'NA')) = 0 
      THEN 
       REPLACE(ISNULL(d.target_grade,'NA'),'N/A','NA') 
      ELSE 
       -- Use -1 NOT 1 
       RIGHT(d.target_grade, CHARINDEX('/',REPLACE(ISNULL(d.target_grade,'NA'), 'N/A', 'NA'))-1) 
     END as target_grade 
FROM tbl --etc. 

-1 НЕ +1

+0

Это верно только в том случае, если вы знаете, что черта появляется точно в центре строки. Эта логика будет по-прежнему неверной, если вы ожидаете, что 'ABC/D' вернет' D' (где ваша версия вернет 'C/D'). Если вы настаиваете на использовании 'RIGHT', а не' SUBSTRING', правильным было бы вычесть результат CHARINDEX из 'LEN'. –

+0

@Damien_The_Unbeliever А я вижу, спасибо, что указали это. – RoyalSwish

Смежные вопросы