评估为 TRUE 的表达式不会在 WHERE 子句中生效
Expression evaluated to TRUE does not take affect in WHERE clause
看看以下三个查询。我不明白当附加到 where 子句时,评估为 TRUE 的条件如何不会 return 行。我希望在第二个查询中获得 User1,因为第一个查询显示条件计算结果为 TRUE。
cr> select full_name, labels, not 'autogenerated' = ANY(labels), not 'autogenerated' = ANY(labels) or labels = [] from testdb_master_core_users;
+----------------+-------------------+-------------------------------------+--------------------------------------------------------+
| full_name | labels | (NOT 'autogenerated' = ANY(labels)) | ((NOT 'autogenerated' = ANY(labels)) OR (labels = [])) |
+----------------+-------------------+-------------------------------------+--------------------------------------------------------+
| User2 Lastname | ["otherlabel"] | TRUE | TRUE |
| User3 Lastname | ["autogenerated"] | FALSE | FALSE |
| User1 Lastname | [] | TRUE | TRUE |
+----------------+-------------------+-------------------------------------+--------------------------------------------------------+
SELECT 3 rows in set (0.003 sec)
cr> select full_name, labels, not 'autogenerated' = ANY(labels) from testdb_master_core_users where not 'autogenerated' = ANY(labels);
+----------------+----------------+-------------------------------------+
| full_name | labels | (NOT 'autogenerated' = ANY(labels)) |
+----------------+----------------+-------------------------------------+
| User2 Lastname | ["otherlabel"] | TRUE |
+----------------+----------------+-------------------------------------+
SELECT 1 row in set (0.002 sec)
cr> select full_name, labels, not 'autogenerated' = ANY(labels) from testdb_master_core_users where not 'autogenerated' = ANY(labels) or labels = [];
+----------------+----------------+-------------------------------------+
| full_name | labels | (NOT 'autogenerated' = ANY(labels)) |
+----------------+----------------+-------------------------------------+
| User2 Lastname | ["otherlabel"] | TRUE |
| User1 Lastname | [] | TRUE |
+----------------+----------------+-------------------------------------+
SELECT 2 rows in set (0.002 sec)
您的期望是正确的 - 第二个查询也应该 return User1.
此行为是由于 select 中表达式的求值方式与 where 子句中的表达式不同所致。后者利用了底层的 lucene 索引,似乎对 NOT 进行了错误的转换,从而导致找不到空列表。
即将发布的 1.0.6 和 1.1.1 版本将解决此问题。
看看以下三个查询。我不明白当附加到 where 子句时,评估为 TRUE 的条件如何不会 return 行。我希望在第二个查询中获得 User1,因为第一个查询显示条件计算结果为 TRUE。
cr> select full_name, labels, not 'autogenerated' = ANY(labels), not 'autogenerated' = ANY(labels) or labels = [] from testdb_master_core_users;
+----------------+-------------------+-------------------------------------+--------------------------------------------------------+
| full_name | labels | (NOT 'autogenerated' = ANY(labels)) | ((NOT 'autogenerated' = ANY(labels)) OR (labels = [])) |
+----------------+-------------------+-------------------------------------+--------------------------------------------------------+
| User2 Lastname | ["otherlabel"] | TRUE | TRUE |
| User3 Lastname | ["autogenerated"] | FALSE | FALSE |
| User1 Lastname | [] | TRUE | TRUE |
+----------------+-------------------+-------------------------------------+--------------------------------------------------------+
SELECT 3 rows in set (0.003 sec)
cr> select full_name, labels, not 'autogenerated' = ANY(labels) from testdb_master_core_users where not 'autogenerated' = ANY(labels);
+----------------+----------------+-------------------------------------+
| full_name | labels | (NOT 'autogenerated' = ANY(labels)) |
+----------------+----------------+-------------------------------------+
| User2 Lastname | ["otherlabel"] | TRUE |
+----------------+----------------+-------------------------------------+
SELECT 1 row in set (0.002 sec)
cr> select full_name, labels, not 'autogenerated' = ANY(labels) from testdb_master_core_users where not 'autogenerated' = ANY(labels) or labels = [];
+----------------+----------------+-------------------------------------+
| full_name | labels | (NOT 'autogenerated' = ANY(labels)) |
+----------------+----------------+-------------------------------------+
| User2 Lastname | ["otherlabel"] | TRUE |
| User1 Lastname | [] | TRUE |
+----------------+----------------+-------------------------------------+
SELECT 2 rows in set (0.002 sec)
您的期望是正确的 - 第二个查询也应该 return User1.
此行为是由于 select 中表达式的求值方式与 where 子句中的表达式不同所致。后者利用了底层的 lucene 索引,似乎对 NOT 进行了错误的转换,从而导致找不到空列表。
即将发布的 1.0.6 和 1.1.1 版本将解决此问题。