0

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

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

4

3 回答 3

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
于 2015-05-28T13:58:38.243 回答
0

由于RIGHT想要“保留多少个字符”而不是“从哪里开始字符串”,所以您当前的逻辑是错误的。

更简单的是,如果您已经有了“从哪里开始字符串”,则可以使用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
于 2015-05-28T13:53:56.530 回答
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

于 2015-05-28T13:57:29.090 回答