在PostgreSQL中查询时需要用空格替换空单元格

问题描述 投票:1回答:2

我正在尝试处理空单元格,并在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语句尝试了很多,但是当我尝试使用类似的东西时,我总是得到类似“错误:语法错误在或附近”的错误:

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

并且当我尝试时出现类似“错误:语法错误在或附近”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

很高兴有出路/ Coalesce语句语法/任何可能有用的东西。再次感谢!

sql postgresql case coalesce
2个回答
0
投票

这是一个简单的语法错误。值需要单引号(''),而不是双引号(""),它表示标识符。这有效:

CASE WHEN d_outage_min = ' ' THEN '"blank"' ELSE d_outage_min END

假设“空”意味着一个空白。对于空字符串使用'',对于NULL使用COALESCE()

Read the manual here.


0
投票

CASE以这两种方式工作。第一种方式,每次重复测试时:

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 or false} THEN {value to return if true}形式

你不能在每一行都有ELSE;如果测试为假,则运行下一个测试。这就是为什么你得到第一个“错误接近WHEN”的原因 - 通过在第一行放置一个else,Postgres期待你结束case块,而不是发出另一个WHEN测试

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

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


第二种方式是一种简短形式,其中一个变量被测试用于许多不同的值:

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

所有相同的规则都适用。如果使用短格式,则无法在中途切换。所有WHEN语句只包含一个值,它将与CASE之后声明的值进行“等于”测试。此表单不常使用,并且未在某些DB中实现

你得到的第二个错误(“CASE附近的错误”)是因为你试图使用彼此相邻的两个case语句而没有任何东西将它们分开,比如字符串连接或逗号


COALESCE是一个带有许多参数的函数,它扫描为第一个非null提供的参数,并返回它

COALESCE(anullcolumn, anothernull, athirdnull, anonnull) -- the value of anonnull will be returned

这在概念上等同于

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是不同的东西!如果您的列为NULL,那么针对单个空格字符测试它们将不起作用!这是你测试它们的方式,如果它们是null:

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

要么

COALESCE(d_outage_min, 'blank') as d_outage_min,
COALESCE(v_outage_min, 'blank') as v_outage_min

聚结更紧凑。它仅在列为空时才有效。如果它们是单个空格字符,那么你必须在什么时候出现

© www.soinside.com 2019 - 2024. All rights reserved.