【问题标题】:multiple condition on a row if not existed return a NULL postgresql如果不存在行上的多个条件,则返回 NULL postgresql
【发布时间】:2018-09-25 23:00:21
【问题描述】:

我有一个类似的架构:

[ad_id] .  [name] . [valueofname]
 1 .        name .    "brian"
 1 .        age  .    "23"
 2 .        job  .    "IT"
 2 .        name .    "Jack" 

行名包含多个值:年龄、姓名、生日、工作、年龄我想将其转换为:

[ad_id] .      [name]  .       [age] .              [birthday] .    [job]
[valueofad_id][valueofname] [valueofnameofage] [valueofnameofbirth] [valueofnameofjob]

我在下面做了这个查询选择来修复它,所以在我的程序中,当name='nameagebirthdayjob'

一些ad_id 没有所有名称,正如您在架构下方看到的那样,ad_id= 1 只有nameage,但没有job,所以我希望在找不到工作时返回NULL

 [ad_id] .  [name] . [valueofname]
  1 .        name .    "brian"
  1 .        age  .    "23"
  2 .        job  .    "IT"
  2 .        name .    "Jack" 


select ad_id,

max(case when name = 'name' and ad_id='xxx' then valueofname end) as name,
max(case when name = 'age' and ad_id='xxx'  then valueofname end) as age,
max(case when name = 'birthday' and ad_id='xxx' then valueofname end) as birthday,
max(case when name = 'job' and ad_id='xxx' then valueofname end) as job

from t
group by ad_id;

【问题讨论】:

  • 您使用的是 MySQL 还是 Postgresql? (不要为不涉及的产品添加标签。)
  • @jarlh 我正在使用 Postgresql ,目的是它可以成为两者的模型
  • valueofname 的数据类型是什么?请添加表架构。
  • 投票结束,因为不清楚您的要求。
  • 添加一些示例表数据和预期结果。 (作为格式化文本,而不是图像。)

标签: sql postgresql go


【解决方案1】:

要展平所有 ad_ids 的记录,请使用:

select ad_id,
       max(case when name = 'name' then valueofname end) as name,
       max(case when name = 'age'then valueofname end) as age,
       max(case when name = 'birthday' then valueofname end) as birthday,
       max(case when name = 'job' then valueofname end) as job
from t
group by ad_id;

要获得单个ad_id 的结果,请添加where 子句:

select ad_id,
       max(case when name = 'name' then valueofname end) as name,
       max(case when name = 'age'then valueofname end) as age,
       max(case when name = 'birthday' then valueofname end) as birthday,
       max(case when name = 'job' then valueofname end) as job
from t
where ad_id = 'xxx' 
group by ad_id;

注意:如果没有带有ad_id = 'xxx' 的行,那么这将不返回任何行。

【讨论】:

  • @Gordon Linoff 它正在工作,而且having子句也在工作,但value字段描述的NULL问题仍然存在:[Type:Text; NOT NULL] 但所做的选择只是一个临时表,因此 NOT NULL 不适用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多