我有两个列,区域和块,其中area是int类型,block是varchar。
现在我正在写两个问题:
select * from table where area and block;
select * from table where area is not null and area <> ''
and block is not null and block <> '';
我在运行这些查询时获得了不同的结果集。他们之间可能有什么区别?
我认为上面的一个返回区域和块都存在,第二个应该返回相同的东西。
答案 0 :(得分:2)
您的第二个查询的行为是正常的,但is not null
因any arithmetic comparison with null
gives null
as the result而block
是多余的。
这里的怪癖是在第一个查询中。使用隐式类型转换,MySQL非常慷慨(无论好坏)。它通过将计算表达式的值隐式转换为布尔值来处理一个没有comparison function or operator的裸表达式作为有效谓词 - 在MySQL的世界中,is just an integer。
您的varchar
列是mysql> SELECT 1 > '6x';
-> 0
mysql> SELECT 7 > '6x';
-> 1
mysql> SELECT 0 > 'x6';
-> 0
mysql> SELECT 0 = 'x6';
-> 1
。 MySQL的documentation page on type conversion显示了当作为裸表达式谓词提供时,此列中的值将如何隐式转换为布尔值(读取:整数):
以下示例说明了将字符串转换为数字 比较操作:
block
这里暗示的是,但是没有明确说明,如果字符串以数字开头,则MySQL“猜测”必须是您想要的数字;否则,它
“猜测”为零。因此,如果'a'
中的值恰好是0
,则第一个查询将隐式地将其转换为WHERE area and 0
并过滤掉该行,因为'a'
永远不会为真。如果您来自在布尔上下文中将非空字符串视为true的语言,那么这是非常意外的!但是,嘿,这是MySQL ......过了一段时间,你学会放下期望。
第二个查询不执行任何隐式转换,因为the <>
operator is actually testing inequality; ''
显然不等于null
,也不是Using properties file: null
Using properties file: null
Parsed arguments:
master yarn-master
deployMode cluster
executorMemory 512m
executorCores null
totalExecutorCores null
propertiesFile null
extraSparkProperties Map()
driverMemory null
driverCores null
driverExtraClassPath null
driverExtraLibraryPath null
driverExtraJavaOptions null
supervise false
queue null
numExecutors 3
files null
pyFiles null
archives null
mainClass com.foo.bar.spark.examples.WordCountSparkJob
primaryResource hdfs://sandbox.hortonworks.com:8020/apps/foo/sandbox.hortonworks.com/1.201-SNAPSHOT/oozieapp/lib/abc-1.201-SNAPSHOT.jar
name Spark Example
childArgs [inputpath=hdfs://sandbox.hortonworks.com:8020/tmp/bcp_examples/input/]
jars null
verbose true
Default properties from null:
Error: Could not load YARN classes. This copy of Spark may not have been compiled with YARN support.
Run with --help for usage help or --verbose for debug output
Intercepting System.exit(-1)
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SparkMain], exit code [-1]
,因此两个谓词都为真,并且不会从结果集中过滤行。