0

フィールドに何かがある場合にのみ文字列に入れる必要がある複数のフィールドがあり、その上、フィールドがnullの場合はフィールド間にコンマを入れたくありません。case when を使用してみましたが、明らかに何か間違ったことをしているので、次のことについて助けていただければ幸いです。

USE newCityCollection

UPDATE PropertyInformationDump
SET    RegistryAdd = (CASE
                        WHEN b.OCAREOF IS NULL THEN Isnull(b.OCAREOF, '')
                        ELSE b.OCAREOF + ' ,'
                      END) + (CASE
                                WHEN b.O1STADD IS NULL THEN Isnull(b.O1STADD, '')
                                ELSE b.O1STADD + ' ,'
                              END) + (CASE
                                        WHEN b.O2NDADD IS NULL THEN Isnull(b.O2NDADD, '')
                                        ELSE b.O2NDADD + ' ,'
                                      END) + (CASE
                                                WHEN b.OSTNAME IS NULL THEN Isnull(b.OSTNAME, '')
                                                ELSE b.OSTNAME + ' ,'
                                              END) + (CASE
                                                        WHEN b.OCITYST IS NULL THEN Isnull(b.OCITYST, '')
                                                        ELSE b.OCITYST + ' ,'
                                                      END) + (CASE
                                                                WHEN b.OZIP IS NULL THEN Isnull(b.OZIP, '')
                                                                ELSE b.OZIP + ' ,'
                                                              END)
FROM   dbo.vw_BRT b
WHERE  BRTNumber = b.PARCEL

フィールドでそれを実行すると、なだが発生し、なぜこれがどのように機能するかについての根本的な誤解である可能性があるのか​​ わかりませんCASE. これらのフィールドが実際には null であり、空ではないことを確認したので、それは問題ではありません。

4

2 に答える 2

7

次の点を考慮してください。SQL で文字列を結合すると、そのうちの 1 つが であるnull場合、結果はnull(*) になります。したがって、 s を削除するnullにコンマを追加すると、少し簡単になります。

SELECT COALESCE(b.OCAREOF + ' ,','') + COALESCE(b.O1STADD + ' ,','') + ...

CASEここでは必要ありません。

COALESCEに似てISNULLおり、いくつかの奇妙な状況を除いて通常は推奨されます-1つは、標準SQLの一部であり(他のRDBMSに対して作業する必要がある場合に役立ちます)、もう1つは、複数の引数を受け入れ、最初の非NULL1を返すことができます. 3 番目の場合、各式の型を考慮して、結果に最も適切なデータ型を使用します -ISNULL常に 2 番目の引数を最初の型に変換しようとします)


(また、式で何をしているのかわかりません-CASEたとえば、nullであることはすでに確立されています-取得するために式をOCAREOF使用する必要はありませんでした)ISNULL''


(*) コンラッドが指摘するように、SQL Server では、これは であることに依存しますCONCAT_NULL_YIELDS_NULLON、デフォルトではそうであり実際には である必要があります

SQL Server の将来のバージョンでCONCAT_NULL_YIELDS_NULLは常に でONあり、オプションを明示的に設定するアプリケーションはすべてOFFエラーを生成します。新しい開発作業でこの機能を使用することは避け、現在この機能を使用しているアプリケーションを変更することを計画してください。

于 2013-01-15T14:11:28.193 に答える