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

时间:2017-12-18 23:36:54

标签: sql postgresql case coalesce

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

user=> (defn p-seq [from to]
          (filter is-p (range from to)))
#'user/p-seq

user=> (p-seq 100 200)
(101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199)

在SELECT语句中使用CASE语句尝试了很多,但是当我尝试使用类似的东西时,我总是得到类似“错误:语法错误在或接近”的错误:

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'

当我尝试时出现“ERROR:语法错误等于或接近”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

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

2 个答案:

答案 0 :(得分:1)

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

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

假设“空”表示一个空白。对于空字符串,请使用''NULL使用COALESCE()

Read the manual here.

答案 1 :(得分: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期待你结束案例块,而不是发出另一个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,那么针对单个空格字符测试它们将不起作用!这是你测试它们的方式,如果它们是空的:

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

Coalesce更紧凑。它仅在列为空时才有效。如果它们是单个空格字符,则必须在

时出现