Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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
需要用“替换空单元格”;“空白”;PostgreSQL中的查询_Sql_Postgresql_Case_Coalesce - Fatal编程技术网

需要用“替换空单元格”;“空白”;PostgreSQL中的查询

需要用“替换空单元格”;“空白”;PostgreSQL中的查询,sql,postgresql,case,coalesce,Sql,Postgresql,Case,Coalesce,我正在尝试处理空单元格,并在PostgreSQL中查询时使用空单元格填充类似“空白”字符串的数据。我的查询如下所示: SELECT t_id, a_date, c_date, o_s_date, o_e_date, ttr_hr, ttn_min, d_sub_outage_impact, tkt_source, d_vertical, d_grp, city, state FROM r.all_t_event b Left Outer Join( select

我正在尝试处理空单元格,并在PostgreSQL中查询时使用空单元格填充类似“空白”字符串的数据。我的查询如下所示:

SELECT t_id, a_date, c_date, o_s_date, o_e_date, 
   ttr_hr, ttn_min, d_sub_outage_impact,  
   tkt_source, d_vertical, d_grp, city, state
FROM r.all_t_event b

   Left Outer Join(
   select i_number,status,o_group
   From r.hpd_help_desk
   Group by i_number,status,o_group) a on a.i_number =b.t_id
Where close_date >= to_timestamp('10/05/2017','mm/dd/yyyy')
and t_condition = 'Outage'
and (a_grp like '%NOC%' or a.o_group like '%NOC%')
and t_id not in ('INC8788','INC26116')
and a.status = '5'
在SELECT语句中尝试了很多CASE语句,但当我尝试以下操作时,总是会出现类似“error:syntax error at或near”的错误:

CASE 
WHEN d_outage_min = " " then "blank" else d_outage_min
WHEN v_outage_min = " " then "blank" else v_outage_min //Error occurred here
.....END
当我尝试时,得到了一个类似于“error:syntax error at or or near”CASE的错误:

CASE 
WHEN d_outage_min = " " then "blank" else d_outage_min
END

CASE //Error occurred here

WHEN v_outage_min = " " then "blank" else v_outage_min
END
CASE...END
我很高兴能找到出路/合并语句语法/任何有帮助的东西。
再次感谢

案例有两种工作方式。第一种方式,当每行重复测试时:

CASE 
  WHEN name = 'john' then 1
  WHEN address LIKE '% road' then 2
  WHEN somecolumn > somevalue THEN 3
  ELSE 4
END
将CASE和END视为开始和结束标记。标记之间的每一行的格式必须为
WHEN{logical test that is true或false}然后{value to return if true}

您不能在每一行上都有一个ELSE;如果测试为false,则运行下一个测试这就是为什么您在何时出现第一个“错误”-通过在第一行添加else,Postgres希望您结束案例块,而不是在测试时发出另一个

你只能有一个,作为最后一件事。如果没有任何结果为true,则给出ELSE返回的值。如果没有其他选项,则给出null

之后指定的所有值/列必须是类型兼容的


第二种方法是一种简短形式,其中一个变量针对多个不同的值进行测试:

CASE gender
  WHEN 'male' THEN 1
  WHEN 'female' THEN 2
  ELSE 'not specified'
END
这相当于

CASE 
  WHEN gender = 'male' THEN 1
  WHEN gender = 'female' THEN 2
  ELSE 'not specified'
END
CASE
  WHEN anullcolumn IS NOT NULL THEN anullcolumn
  WHEN anothernull IS NOT NULL THEN anothernull
  WHEN athirdnull IS NOT NULL THEN athirdnull
  WHEN anonnull IS NOT NULL THEN anonnull
END
同样的规则也适用。如果使用缩写形式,则不能中途切换形式。所有WHEN语句只包含一个值,它将与使用“equals”测试后声明的值进行比较。这种形式很少使用,并且在某些数据库中没有实现

您得到的第二个错误(“靠近CASE的错误”)是因为您试图使用两个相邻的CASE语句,而不使用任何东西来分隔它们,例如字符串连接或逗号


COALESCE是一个接受许多参数的函数,它扫描为第一个非空参数提供的参数,并返回它

COALESCE(anullcolumn, anothernull, athirdnull, anonnull) -- the value of anonnull will be returned
这在概念上等同于

CASE 
  WHEN gender = 'male' THEN 1
  WHEN gender = 'female' THEN 2
  ELSE 'not specified'
END
CASE
  WHEN anullcolumn IS NOT NULL THEN anullcolumn
  WHEN anothernull IS NOT NULL THEN anothernull
  WHEN athirdnull IS NOT NULL THEN athirdnull
  WHEN anonnull IS NOT NULL THEN anonnull
END
只是读和写的感觉好多了

正如Erwin所指出的,一旦修复了由于case语句完全损坏而导致的语法错误,编译器将继续检查字符串并开始抱怨这些错误。在sql中使用撇号表示字符串,而不是语音标记

'This is a string in sql'
"Not a string"
Postgres使用语音标记来表示区分大小写的表名和列名。如果你能帮上忙,就不要用它们


您的尝试应该如下所示:

CASE 
WHEN d_outage_min = ' ' then 'blank' else d_outage_min
END as d_outage_min,
CASE
WHEN v_outage_min = ' ' then 'blank' else v_outage_min
END as v_outage_min
两个case语句,每列一个可能为空(单个空格字符),用逗号分隔

请注意,null和space是不同的东西!如果列为空,那么针对单个空格字符测试它们将不起作用!这就是测试它们的方法,如果它们为空:

CASE 
WHEN d_outage_min IS NULL then 'blank' else d_outage_min
END as d_outage_min,
CASE
WHEN v_outage_min IS NULL then 'blank' else v_outage_min
END as v_outage_min


聚结更紧密。仅当列为null时,它才起作用。如果它们是单个空格字符,则必须在出现简单语法错误时使用大小写需要单引号(
),而不是双引号(
),它们表示标识符。这项工作:

CASE WHEN d_outage_min = ' ' THEN '"blank"' ELSE d_outage_min END
假设“空”表示单个空白。对于空字符串,使用
'
,对于
NULL
使用


“blank”
是一个标识符,而不是字符串:我确实用COALESCE得到了答案。为了修复整个查询,我必须对时间戳和数字类型字段进行更多的处理。非常感谢您的所有投入,非常有帮助!对延迟回复表示歉意。