添加到CHARINDEX()时SQL Server 2005 - RIGHT()不起作用

时间:2015-05-28 13:46:56

标签: sql-server-2005 charindex

我正在尝试使用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

我在这里做错了什么?我的逻辑有缺陷吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

由于RIGHT需要"要保留多少字符"而不是"从"开始字符串的位置,你当前的逻辑是错误的。

更简单,如果你已经有"从哪里开始#34;是使用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

答案 2 :(得分: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