我正在尝试使用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
我在这里做错了什么?我的逻辑有缺陷吗?
答案 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