2017-03-14 18 views
0

私が今までに見た中で最も奇妙に照合されたデータベースで作業しています。私は十分に簡単なケースステートメントを実行しています。SQL Server Case Statementフィールドが空白の場合は、フィールド全体の内容が返されます

コード:

SELECT CASE 
     WHEN PMA_DESC = ' ' THEN dbo.CAN_TBL.CAN_DESC 
     ELSE 'NO DESCRIPTION' 
     END AS PMA_DESC 
     , PMA_PART_ONLY 
     , PMA_ANAL_FIELD1 
     , CAN_DESC 
     , PMA_CREATED 
     , PMA_UPDATED 
FROM dbo.PMA_TBL INNER JOIN 
    dbo.CAN_TBL ON dbo.PMA_TBL.PMA_ANAL_FIELD1 = dbo.CAN_TBL.CAN_CODE 
WHERE  (CAST(dbo.PMA_TBL.PMA_CREATED AS DATE) >= DATEADD(dd, - 3, CAST(GETDATE() AS DATE)) OR 
        CAST(dbo.PMA_TBL.PMA_UPDATED AS DATE) >= DATEADD(dd, - 3, CAST(GETDATE() AS DATE))) AND (dbo.PMA_TBL.PMA_DESC IS NOT NULL) 

case文の最初の部分はスペースが、何が移入されたカラム内の唯一の44の記録にもかかわらず、列全体を返しPMA_DESCフィールドにスペースを探していること。それで、フィールド内のスペースを見つけ出し、フィールドの内容全体を肯定的な結果として返します。 3 1/2年前にSQL Serverを使い始めて以来、私はそれを見たことがありません。それはデータベースの照合と関係がありますか?私はこれが大文字と小文字の区別を強制するように設定されていることを知っています(yay)。

結果の選択。

PMA_DESC  PMA_PART_ONLY PMA_ANAL_FIELD1  CAN_DESC 
NO DESCRIPTION 82240069  82     GLACIER MTM 
NO DESCRIPTION 8228399   82     GLACIER MTM 
NO DESCRIPTION 8235579   82     GLACIER MTM 

最初の列の結果は、すでに自分の個々の部分の説明があったが、彼らは単語の間にスペースが含まれているため、case文はにそれを変えた「NO DESCRIPTION」。それは間違いないでしょうか?

どのようにして[field] = ' 'は空白の周囲のテキストを確認できますか?順序SQL_Latin1_General_CP1_CI_AS

+0

* "これはデータベースの照合と何か関係ありますか?" - おそらく。なぜその照合が指定されていないのですか?また、いくつかの最小限の完全で再現可能な例を作成することで、問題を解決するのに役立ちます。 –

+0

はい、そうです、良い点。プロパティでそれを見つけた後に追加しました。ありがとう。 –

+0

照合は* spaces *とは関係ありません。これはANSI SQLの標準規格です(ここで説明します)(https://support.microsoft.com/en-us/help/316626/inf-how-sql-server-compares-strings-with-trailing-spaces)。比較の前に文字列をスペースで埋めて、両辺の長さが同じであることを確認します。 'LEN()'または 'DATALEN()'を使用するか、空白にマッチさせる場合は 'LIKE '' 'を使用してください。 –

答えて

0

それは私が正しく私のcase文のロジックをワークアウト劣等生であることとではありません。

データベースの照合順序は次のように設定されています。これは私が必要とする結果を生み出すので、他の値と一緒に空のスペースで正しく動作しないということでした。

SELECT CASE 
     WHEN PMA_DESC = ' ' AND CAN_DESC IN ('INVOICE ODDBALLS','SLOW MOVING') THEN 'NO DESCRIPTION' 
      WHEN PMA_DESC = ' ' AND CAN_DESC NOT IN ('INVOICE ODDBALLS','SLOW MOVING') THEN CAN_DESC 
      ELSE PMA_DESC 
      END AS PMA_DESC , PMA_PART_ONLY, PMA_ANAL_FIELD1, CAN_DESC, PMA_CREATED, PMA_UPDATED 
FROM   dbo.PMA_TBL INNER JOIN 
        dbo.CAN_TBL ON dbo.PMA_TBL.PMA_ANAL_FIELD1 = dbo.CAN_TBL.CAN_CODE 
WHERE  (CAST(dbo.PMA_TBL.PMA_CREATED AS DATE) >= DATEADD(dd, - 3, CAST(GETDATE() AS DATE)) OR 
        CAST(dbo.PMA_TBL.PMA_UPDATED AS DATE) >= DATEADD(dd, - 3, CAST(GETDATE() AS DATE))) AND (dbo.PMA_TBL.PMA_DESC IS NOT NULL) 

私は読んでくれてありがとうございました。次回はもっと頑張ります!

関連する問題