4

今日、SQL の ISNULL 関数で奇妙な問題が発生しました

テーブルには顧客情報が含まれており、ファースト、ミドル イニシャル、ラスト ネームを連結したフルネームを表示する必要があります。

したがって、SQL で ISNULL 関数を使用して、ミドル イニシャルが null でない場合は正常に動作しますが、ISNULL 関数を以下の式で使用しました。これは、MI が null の場合に理想的には機能しないはずですが、興味深いことに機能しました.

SELECT FirstName + ' ' + LastName + ' '+ ISNULL(MI + '.', '') As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

上記の SOL クエリは、MiddleInitial を "." として返す必要があります。MiddleInitial が null の場合、空の文字列として返されます。

そこで、以下のように別のクエリを書きました。

SELECT (MI + '.') AS MiddleInitial FROM CS_tblMaster WHERE CustomerNo = 2627240

これも NULL として指定されます

どういうわけか、文字列を NULL 値で連結すると、null が返されます。この実装について理解したいと思います。

誰か助けてくれませんか

4

6 に答える 6

1

– 元の声明

SELECT FirstName + ' ' + LastName + ' '+ ISNULL(MI + '.', '') As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

– 私の元の回答 (編集)

SELECT FirstName + ' ' + LastName + ' '+ (ISNULL(MI, '') + '.') As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

この場合、SQL は最初に MI が Null かどうかを確認し、Null でない場合は MI を使用し、NULL の場合は空の文字列を使用します。次に、Null にならない結果をピリオドと連結します。

– 最終的な答え

SELECT 
    FirstName + ' ' + LastName + ' '
        + CASE WHEN MI IS NULL THEN '' ELSE MI + '.' END As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

@Satish、まだ回答を選択していないため、まだ回答があると感じているかどうかわかりません。私の回答が短くて速かった場合は申し訳ありません。すべての回答を見て、最初にあなたの質問を見たとき、私はあなたの質問についてあまり考えていなかったことに気づきました.

「この実装について理解したい」と答えると、Null は SQL における完全に特殊な値です。空の文字列、スペース、ゼロではありません。それらは、より文字通りの意味で「何もない」という意味です。それらをチェックして、何かnullかどうかを確認できます。しかし、Null で何かを「実行」することはできません。したがって、57 + Null = Null です。'Mary' + Null = Null. ((12 *37) +568) / Null = Null. 「Albert」、「Mary」、Null、および「Zeke」の Max() は Null です。この記事http://en.wikipedia.org/wiki/Null_(SQL)は、Null Propagation のセクションに適切な説明があり、役立つ場合があります。

Isnull 関数は、Null のテストではなく、それを処理する方法です。したがって、何かが Null かどうかをテストするには、Select で ColumnName Is Null または ColumnName Is Not Null を使用します。Isnull(MI,'') の意味は次のとおりです。値が必要です。MI の値が null でない場合は MI が必要です。それ以外の場合は空の文字列が必要です。

続けて、あなたが実際にやろうとしていることを最初に理解したかどうかはわかりません. 中間のイニシャルが null の期間を取得しようとしている場合は、私の最初の答えと他のほとんどの答えがうまくいくでしょう。しかし、あなたはこう言いたいのかもしれません: ミドルネームのイニシャルがある場合、ミドルネームのイニシャルの後にピリオドが必要です. ミドルネームのイニシャルがない場合、「Alberto C. Santaballa」または「Alberto Santaballa」ではなく、「Alberto . サンタバラ」。その場合は、編集した回答の最後のステートメントを使用してください。

@Zec、編集していただきありがとうございます。タイプミスは速すぎるタイピングの別の産物でした! :-/

于 2013-07-24T10:03:00.580 に答える
0

兄弟、あなたはisnull関数を誤解していると思います

ISNULL([Columns To Check],[Replaced String]) 

SELECT FirstName + ' ' + LastName + ' '+ ISNULL(MI + '.', '') As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

ISNULL関数が参照するのは、チェックしたい列がnullであり、それを他の文字列に置き換えます

あなたのクエリでは、あなたは ur MI+'.' を置き換えようとしています。列から空の文字列への列、うまくいけば私の説明があなたを助けることができます=)

于 2013-07-24T01:33:50.153 に答える