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 に答える