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
但是,如果我删除 +1
,RIGHT
功能将完全正常工作
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
我正在尝试使用 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
但是,如果我删除 +1
,RIGHT
功能将完全正常工作
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