在PostgreSQL中使用ltree处理层次结构数据的方法( 二 )

  
 user_id |   path  
———+————————–  
  6 | 0001.0003  
  8 | 0001.0003.0001  
  9 | 0001.0003.0002  
  11 | 0001.0003.0002.0001  
  2 | 0001.0003.0002.0002  
  5 | 0001.0003.0002.0003  
  7 | 0001.0003.0002.0002.0001  
  20 | 0001.0003.0002.0002.0002  
  31 | 0001.0003.0002.0002.0003  
  22 | 0001.0003.0002.0002.0004  
  34 | 0001.0003.0002.0002.0005  
  22 | 0001.0003.0002.0002.0006  
(12 rows)  
你不应该忘记数据的顺序,如下的例子:  
$ INSERT INTO comments (user_id, description, path) VALUES ( 9, md5(random()::text), ‘0001.0003.0001.0001’);  
$ INSERT INTO comments (user_id, description, path) VALUES ( 9, md5(random()::text), ‘0001.0003.0001.0002’);  
$ INSERT INTO comments (user_id, description, path) VALUES ( 9, md5(random()::text), ‘0001.0003.0001.0003’);  
$ SELECT user_id, path FROM comments WHERE path ~ ‘0001.0003.*’;  
user_id |   path  
———+————————–  
  6 | 0001.0003  
  8 | 0001.0003.0001  
  9 | 0001.0003.0002  
  11 | 0001.0003.0002.0001  
  2 | 0001.0003.0002.0002  
  5 | 0001.0003.0002.0003  
  7 | 0001.0003.0002.0002.0001  
  20 | 0001.0003.0002.0002.0002  
  31 | 0001.0003.0002.0002.0003  
  22 | 0001.0003.0002.0002.0004  
  34 | 0001.0003.0002.0002.0005  
  22 | 0001.0003.0002.0002.0006  
  9 | 0001.0003.0001.0001  
  9 | 0001.0003.0001.0002  
  9 | 0001.0003.0001.0003  
(15 rows)  
现在进行排序:  
$ SELECT user_id, path FROM comments WHERE path ~ ‘0001.0003.*’ ORDER by path;  
 user_id |   path  
———+————————–  
  6 | 0001.0003  
  8 | 0001.0003.0001  
  9 | 0001.0003.0001.0001  
  9 | 0001.0003.0001.0002  
  9 | 0001.0003.0001.0003  
  9 | 0001.0003.0002  
  11 | 0001.0003.0002.0001  
  2 | 0001.0003.0002.0002  
  7 | 0001.0003.0002.0002.0001  
  20 | 0001.0003.0002.0002.0002  
  31 | 0001.0003.0002.0002.0003  
  22 | 0001.0003.0002.0002.0004  
  34 | 0001.0003.0002.0002.0005  
  22 | 0001.0003.0002.0002.0006  
  5 | 0001.0003.0002.0003  
(15 rows)  
可以在lquery的非星号标签的末尾添加几个修饰符,以使其比完全匹配更匹配:  
“ @”-不区分大小写匹配,例如a @匹配A  
“ *”-匹配任何带有该前缀的标签,例如foo *匹配foobar  
“%”-匹配以下划线开头的单词  
$ SELECT user_id, path FROM comments WHERE path ~ ‘0001.*{1,2}.0001|0002.*’ ORDER by path;  
 user_id |   path  
———+————————–  
  2 | 0001.0001.0001  
  2 | 0001.0001.0001.0001  
  1 | 0001.0001.0001.0002  
  5 | 0001.0001.0001.0003  
  6 | 0001.0002.0001  
  8 | 0001.0003.0001  
  9 | 0001.0003.0001.0001  
  9 | 0001.0003.0001.0002  
  9 | 0001.0003.0001.0003  
  9 | 0001.0003.0002  
  11 | 0001.0003.0002.0001  
  2 | 0001.0003.0002.0002  
  7 | 0001.0003.0002.0002.0001  
  20 | 0001.0003.0002.0002.0002  
  31 | 0001.0003.0002.0002.0003  
  22 | 0001.0003.0002.0002.0004  
  34 | 0001.0003.0002.0002.0005  
  22 | 0001.0003.0002.0002.0006  
  5 | 0001.0003.0002.0003  
(19 rows)  
我们来为parent ‘0001.0003’找到所有直接的childrens,见下:


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。