wolong 发表于 2016-11-22 09:23:49

postgres中几个复杂的sql语句

postgres中几个复杂的sql语句

需求一
  需要获取一个问题列表,这个问题列表的排序方式是分为两个部分,第一部分是一个已有的数组 第二个部分是按照id进行排序,但是需要过滤掉前面已有的数组。
  最开始的时候我大概是想这么写的:
  

select * from question where>array_cat(  ARRAY::integer[],
  (select array(

  select>  (0,579489,579482,579453,561983,561990,562083)
  and status in (1, -1)

  and created_at > 1426131436 order by>  )::integer[]
  )
  
)
  

  这里用了个字查询来查找问题,然后和array做一个链接。但是发现这个 = any 返回的结构并不是按照我想要的排序。有没有办法让 = any 按照指定顺序返回呢?后来经过别人帮忙,将sql语句改成:
  

select * from question q join (  select * from unnest(
  array_cat( ARRAY::integer[], (
  select array(

  select>  )
  )::integer[] )

  ) WITH ORDINALITY as>  
) as tmp on q.id = tmp.id order by tmp.rn
  

  这里主要有几个函数:
  
一个是unnest函数,是将一个array变成一个多行的子查询结果。
  
一个是WITH ORDINALITY,这个函数是只在pg9.4中才增加的函数,和unnest一起使用能返回对应的数组和在数组中的排序。

需求二
  现在有个表,有个字段是content,content 里面存储的是双层json,即
  {"title": "testtest", "content": "{"id":23,"qid":580585,\
  
"content":"\u8fd9\u4e2a\u662f\u8ffd\u95ee"}"}
  现在我要获取按照解析后的qid进行排序分页的结构。
  使用了json ->> 符号
  语句实现如下:
  

select a.question_id, max(is_read) as is_read from (
  select>  from inbox where receiver=1
  
) a group by a.question_id order by a.question_id desc offset 0 limit 10
  

  这里的json->>直接使用了两层解析结构。

总结
  pgsql中的查询函数非常神奇,只有你想不到的,没有写不了的。
页: [1]
查看完整版本: postgres中几个复杂的sql语句