Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Postgres中:在多个值上使用'is DISTINCT'和'is'最简洁的方式是什么?_Sql_Postgresql - Fatal编程技术网

Sql 在Postgres中:在多个值上使用'is DISTINCT'和'is'最简洁的方式是什么?

Sql 在Postgres中:在多个值上使用'is DISTINCT'和'is'最简洁的方式是什么?,sql,postgresql,Sql,Postgresql,我试图查找所有具有枚举列的行,该列要么为NULL,要么与给定的枚举值集不同。我可以用很多来自调用的IS-dinstint来实现它,但是它非常冗长,我宁愿不在语法中使用,但是NULL会忽略这一点 下面是我想在SQL中执行的操作的一个示例,来自以下几点: 创建类型mood作为枚举'sad'、'ok'、'happy'; 创建桌面人员 名称文本, 当前的情绪, 当前\u情绪\u作为\u文本varchar ; 在人们的价值观中插入“快乐先生”、“快乐”、“快乐”; 在人们的价值观中插入“悲伤先生”、“悲伤

我试图查找所有具有枚举列的行,该列要么为NULL,要么与给定的枚举值集不同。我可以用很多来自调用的IS-dinstint来实现它,但是它非常冗长,我宁愿不在语法中使用,但是NULL会忽略这一点

下面是我想在SQL中执行的操作的一个示例,来自以下几点:

创建类型mood作为枚举'sad'、'ok'、'happy'; 创建桌面人员 名称文本, 当前的情绪, 当前\u情绪\u作为\u文本varchar ; 在人们的价值观中插入“快乐先生”、“快乐”、“快乐”; 在人们的价值观中插入“悲伤先生”、“悲伤”、“悲伤”; 在人员值中插入'Mr Null',Null,Null; -由于空值,因此不会返回MrUnknown: 从当前情绪不“快乐”的人中选择*; -这非常有效,包括Null先生: 从当前情绪不同于“快乐”的人群中选择*; -但如果我想开始比较多种情绪,它会变得更加冗长: 从人物中选择* 当前的情绪有别于“快乐”和 当前的情绪不同于“悲伤”; -你不能写这个,但这正是我想要的: -从人物中选择* -当前的情绪有别于“快乐”、“悲伤”; -对于非枚举列,我可以这样做以使我的意图和代码清晰简洁 从人物中选择* 在哪里把当前的情绪凝聚成文字,而不是“快乐”、“悲伤”; -但是如果我写这个,我会得到一个错误,因为它不是有效的枚举值 -从人物中选择* -哪里凝聚着当前的情绪,不在‘快乐’、‘悲伤’; 有没有其他方法可以使这种多重比较更简洁?

使用coalesce的解决方案:

还有另一种方式:


SELECT * FROM people 
WHERE NOT EXISTS (
  SELECT FROM (VALUES ('happy'::mood), ('sad')) v(m)
  WHERE people.current_mood = v.m
);

CleanestIMO方法是在CTE内使用值,并在该表表达式上执行“不存在”:


当前情绪不在“快乐”、“悲伤”或当前情绪为空?酷-我认为这会对没有名字的马起作用。我有点难过,我不能只是把一个聚结或是不同于在那里,但这并不可怕与行表达式的工作方式不同,也不存在。。。[主键会很方便,这里]@a_horse_和_no_名称,我记得在PostgreSQL的某些版本中,特别是对于数组元素,比较null==null返回true,null null返回false,这与经典SQL不同。At horse:Tnx。我有一个新键盘-哇,我并没有意识到我可以用这种方式合并,但这是有道理的。在“happy”和“sad”中NULL NOT的结果是NULL…在使用NOT IN或IN之前,我试图合并

SELECT * FROM people 
WHERE NOT EXISTS (
  SELECT FROM (VALUES ('happy'::mood), ('sad')) v(m)
  WHERE people.current_mood = v.m
);

WITH m(m) AS ( VALUES( 'happy'::mood) )
SELECT *
FROM people p
WHERE NOT EXISTS (
        SELECT * FROM m
        WHERE m.m = p.current_mood
        );