我遇到了一个困难,因为当比较子查询中的两个字段时,尽管字段是相同的,即它们都有空值,但是比较返回一个错误的结果Therfore NULL=NULL返回FALSE现在我知道空值应该与IS运算符进行比较,但是当我比较两个字段时,我怎么知道它们包含空值?如果值为空或不为空,我需要比较两个字段的相同数据。考虑这个SQL:SELECT*FROMfts.fts_customers_data_50360001WHERE fts.fts_customers_data_50360001.record_type = 15 AND fts.fts_customers_data_50360001.mid = 103650360001 AND NOT EXISTS ( SELECT fts.temp_fees_50360001.record_type FROM fts.temp_fees_50360001 WHERE fts.temp_fees_50360001.record_type = fts.fts_customers_data_50360001.record_type AND fts.temp_fees_50360001.merch_id = fts.fts_customers_data_50360001.mid AND fts.temp_fees_50360001.fee_curr = fts.fts_customers_data_50360001.currency AND fts.temp_fees_50360001.card_scheme = fts.fts_customers_data_50360001.card_scheme AND fts.temp_fees_50360001.tran_type = fts.fts_customers_data_50360001.fee_type AND fts.temp_fees_50360001.area = fts.fts_customers_data_50360001.region AND fts.temp_fees_50360001.srvc_type = fts.fts_customers_data_50360001.card_type );在上面的查询中,fts.temp_fees_50360001.card_scheme=fts.fts_customers_data_50360001.card_scheme两者的内部都有空值,但比较返回false。。太糟了有什么想法我会非常感激的 最佳答案 正如其他人所指出的,NULL不能与NULL相比。在Postgres中,您可以使用运算符IS DISTINCT FROM来缩短表达式,该运算符是<>的空安全替换。在您的例子中,您需要使用IS NOT DISTINCT FROM来比较相等性(看起来有点不对,但不幸的是,在SQL标准中没有相应的IS EQUAL TO定义)。From the manual:当任一输入为空时,普通的比较运算符产生null(表示“未知”),而不是true或false。例如,7=NULL会产生NULL,正如7NULL一样。当此行为不合适时,请使用与构造不同的is[not]:所以,代替(fts.temp_fees_50360001.record_type = fts.fts_customers_data_50360001.record_type OR (fts.temp_fees_50360001.record_type IS NULL AND fts.fts_customers_data_50360001.record_type IS NULL))您可以使用:(fts.temp_fees_50360001.record_type IS NOT DISTINCT FROM fts.fts_customers_data_50360001.record_type)自动处理空值。如果你想比较是否相等,这个条件看起来有点奇怪,但它仍然很短。关于sql - SQL:field = other_field返回false,即使它们相同(NULL值),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20237544/
10-11 18:14