4

小さな質問が1つあります。私は新しいので、助けてください。

私のプロジェクトでは、とを含む1つのテキストファイルがzip4ありzip5、両方の郵便番号を連結したいのですが、問題が1つあります。ある場所で、zip4が空白(nullではない)であるため、派生列を

ISNULL(ZIP_4) ? ZIP_5 : (ZIP_5 + "-" + ZIP_4) 

式を返します

(zip5-)

ここzip4は空白で、zip5なしでのみ必要-です。

だから私を助けてください。

4

2 に答える 2

4

試す

ISNULL([ZIP_4]) || LEN([ZIP_4]) == 0  ? [ZIP_5] : ([ZIP_5] + "-" + [ZIP_4]) 

また

ISNULL([ZIP_4]) || LEN(RTRIM(LTRIM([ZIP_4]))) == 0  ? [ZIP_5] : ([ZIP_5] + "-" + [ZIP_4]) 

zip_42つ目は、長さを確認する前に両側をトリミングします。

于 2012-09-05T17:39:17.380 に答える
0

ANSIで定義されている動作は、nullnullity()の明示的なテストの保存を含むすべての操作でis [not] nullnullが生成されることです。残念ながら、SQLServerのデフォルトの動作は非標準です。それで...

スタンドアロンクエリを実行する前に、次の2つの設定がストアドプロシージャに対してオンになっているか、接続でオンになっていることを確認する必要があります。

  • set ansi_nulls on
  • set concat_nulls on

これらをストアドプロシージャの本体でオンに設定した場合、設定はそのストアドプロシージャ内でのみ適用されます。(ステートメントを実行することによってset)接続に対してそれらをオンに設定すると、それらはその接続で実行されるすべてのクエリに対して1つになります(ストアドプロシージャが独自の実行コンテキストを持っていることを除く)。

null欠測データが常にnil文字列()ではなく、常に保証できないのは残念です''。これにより、ロジックが単純になります。

とにかく、適切な `null動作を有効にすると、次のようになります。

-- if missing data is always NULL, do this
select zip9 = t1.zip5 + coalesce( '-'+t1.zip4 , '' )
from someTable t1

また

-- if missing data might be nil ('') or NULL, do this
select zip9 = t1.zip5
            + coalesce(
                '-'
                + case coalesce(t1.zip4,'') when '' then null else t1.zip4 end ,
                ''
                )
from someTable t1

トリックを行う必要があります。

それ以外の場合、正しい動作を有効にしたくない場合は、次のようにすることができます。これは、標準のNULL動作でも機能します。複数のテストが含まれるので、私はそれが好きではありません。しかし、彼らが言うように、 TMTOWTDI

select zip9 = t1.zip5
            + case
                when t1.zip4 = ''    then ''
                when t1.zip4 is null then ''
                else '-' + t1.zip4
              end
from someTable t1
于 2012-09-05T17:50:52.090 に答える