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

SQL Server 2005 - RIGHT() not working when adding to CHARINDEX()

我正在尝试使用 RIGHT 函数来获取一个值的子字符串(如果它包含一个“/”),但是当我向 [=16 添加一个数字时它不起作用=] 值;只是没有。

这是代码示例:

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.

这个return例如

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

应该return虽然这个

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

但是,如果我删除 +1RIGHT 功能将完全正常工作

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

我在这里做错了什么?我的逻辑有问题吗?

既然RIGHT想要"how many characters to keep"而不是"where to start the string from",你现在的逻辑是错误的。

更简单,如果你已经有"where to start the string from"就是使用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

愚蠢的我,就像@MarkBannister 说的,charindex 从字符串的 left 算起,但是 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

我建议通过利用 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