2

値の不一致について2つのテーブル間で比較が行われる単純なSQLクエリがあります。昨日、1 つのフィールドが null で、もう 1 つのフィールドが null でないという問題を発見しましたが、不一致は検出されませんでした。私が判断できる限り、ロジックは昨日までずっと機能していました。SQL のロジックは次のとおりです。

CREATE TABLE Table1
(UserID INT,PlayDate DATETIME)

CREATE TABLE Table2
(UserID INT,PlayDate DATETIME)

INSERT INTO Table1 (UserID)
SELECT 5346

INSERT INTO Table2 (UserID,PlayDate)
SELECT 5346,'2012-11-01'

SELECT a.UserID
FROM   Table1 a
INNER JOIN
       Table2 b
ON     a.UserID = b.UserID
WHERE  a.PlayDate <> b.PlayDate

PlayDate の値が異なっていても、値は返されません。

読む場所を更新しました:

WHERE  ISNULL(a.PlayDate,'') <> ISNULL(b.PlayDate,'')

元のコードがフィールドの違いを認識しなくなるように誰かが変更した可能性のある SQL の設定はありますか?

ありがとう

4

2 に答える 2

1
NULL <> anything

ありunknownませんtrue。SQL は 3 つの値を持つロジック (false/true/unknown) を使用し、述語は行が返される句で評価される必要がtrueありwhereます。

実際、標準 SQL では、 yieldsをNULL除いてすべての比較が行われます。含むIS [NOT] NULLunknownWHERE NULL = NULL

RDBMSについては述べていませんが、それがサポートされているIS DISTINCT FROM場合はそれを使用できます。または、MySQLを使用している場合は、無効<=>にできるヌルセーフ等価演算子があります。

あなたは、以前は違った振る舞いをしたと思うと言います。SQL Server を使用している場合は、ANSI_NULLS何らかの理由で別の設定を使用している可能性がありますが、この設定は非推奨であり、とにかくそれに依存するコードを書き直す必要があります。

IS DISTINCT FROMSQL ServerでシミュレートできますWHERE EXISTS (SELECT a.PlayDate EXCEPT SELECT b.PlayDate)

于 2012-11-19T10:41:23.573 に答える
0

NULL でさえ NULL と同じになることはできません。

  • うまくいかない 2 つの一般的なクエリを次に示します。

select * from table where column = null;

select * from table where column <> null;

  • sよりも大きいか小さいかの等号または不等号の概念はありませんNULL。代わりに、s について議論するときは、(「等しい」という言葉を使わずに)「である」または「ではない」としか言えませんNULL

- クエリの正しい書き方

select * from table where column IS NULL;

select * from table where column IS NOT NULL;

于 2016-01-07T10:28:14.567 に答える