2012-01-06 14 views
2

したがって、FIELD2は、Myconditionの値に応じて1つの結果として連結されたフィールドの2つのグループを返すことができます。TSQLの長さの置き換え

私の問題があるときMycondition = 1

MyCondition = 1は、その後、私はINT_FIELD_ONE + '' + INT_FIELD_TWOを連結する必要がある場合。

連結は問題ではありません。

問題は、INT_FIELD_ONE(null)+ 'A' + INT_FIELD_TWO(null)の場合、何も返す必要がありません。

[置換]コマンドは、両方のフィールドが1つでもNULLの場合に機能します。しかし、1だけがNULLで、もう1つが "A"でなければ削除されません。 1つのフィールドがnullでない場合、Aは残る必要があります。例について

NULL + '' + NULL =なし

NULL + '' + XXXX = AXXXX

XXXX + '' + NULL = xxxxA

したがって、結果の長さ制約を1に置き換えてTSQLを作成する必要があります。

どのようなアイデアですか?

SELECT XXX, 

CASE --Case Statement to Return Field2 
     WHEN MyCondition = 1 THEN 
     --Constraint on the Replace Starts Here 
     REPLACE(
     Isnull(CAST(INT_FIELD_ONE AS VARCHAR), '') + 'A' + 
     Isnull(CAST(INT_FIELD_TWO AS 
        VARCHAR), '') 
     ,'A','') 
ELSE 
     REPLACE(
     Coalesce(REPLACE(INT_FIELD_THREE, '', '-'), Isnull(INT_FIELD_THREE, '-'), INT_FIELD_THREE) + 
       '/' + Coalesce(REPLACE(INT_FIELD_FOUR, '', '-'), 
         Isnull(INT_FIELD_FOUR, '-'), INT_FIELD_FOUR) + ' ', '-/- ', 
     '') 
END 
AS FIELD2 


FROM TABLEX 

答えて

3

これはどうですか?今、あなたは確かに知っているので、あなたのフィールドのいずれかが両方int1int2がある

2
… 
WHEN MyCondition = 1 THEN 
    ISNULL(
    NULLIF(
     ISNULL(CAST(int1 AS VARCHAR), '') + 'A' + ISNULL(CAST(int2 AS VARCHAR), ''), 
     'A' 
    ), 
    '' 
) 
… 

場合はnullではないことを連結を行っているREPLACE関数は必要ありません

CASE WHEN MyCondition = 1 AND (INT_FIELD_ONE IS NOT NULL OR INT_FIELD_TWO IS NOT NULL) THEN concat.. 
    WHEN MyCondition = 1 THEN NULL -- at that point we know that both are null 
    ELSE ... END 

お知らせNULLの場合、連結の結果はAになります。式がAを返した場合、NULLIF()はNULLを返します。そうでない場合は、式の結果が返されます。外側のISNULL()はNULLを空文字列に変換するか、最初の引数にあるNULL以外の値を返します。

関連する問題