国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

將查詢結(jié)果連接成列表的幾個(gè)方法

2024-07-21 02:39:11
字體:
供稿:網(wǎng)友

  我們在實(shí)際開發(fā)過程中, 經(jīng)常需要將一個(gè)查詢的結(jié)果連接成一個(gè)單行的字符串列表, 比如說將一個(gè)部門及其所有員工列在一行顯示.
  
  本文介紹了從最簡單到最通用的幾種方法來達(dá)到這一目的.
  
  1.  已知列的取值范圍
  
  比如說, 有以下產(chǎn)品表, 每種產(chǎn)品只有3種顏色(R-RED, B-BLACK, W-WHITE):
  
  scott@ORCL> DESC PROD
  
  名稱                   空?   類型
  
  ----------------------------------------- -------- --------------
  
  PRODNAME                      VARCHAR2(20)
  
  COLOR                       VARCHAR2(1)
  
  scott@ORCL> SELECT * FROM PROD;
  
  PRODNAME       C
  
  -------------------- -
  
  CAR         R
  
  CAR         B
  
  CAR         W
  
  MOTOR        W
  
  MOTOR        B
  
  我們希望列出每種產(chǎn)品都有哪些顏色.
  
  這種情況下, 只要簡單的使用decode()函數(shù)即可.
  
  下面是script代碼及相應(yīng)的運(yùn)行結(jié)果.
  scott@ORCL> COLUMN COLORS FORMAT A10
  
  scott@ORCL >select PRODNAME,
  
  2     max(decode( COLOR, 'B', COLOR, null )) 
  
  3     max(decode( COLOR, 'W', COLOR, null )) 
  
  4     max(decode( COLOR, 'R', COLOR, null )) COLORS
  
  5 from PROD
  
  6 group by PRODNAME
  
  7 /
  
  PRODNAME       COL
  
  -------------------- ---
  
  CAR         BWR
  
  MOTOR        BW
  
  2. 靜態(tài)SQL
  
  這種方法適合于列的取值不能預(yù)知, 由于使用靜態(tài)sql, 相對方法3來說比較簡單. 不過該函數(shù)只能用于特定的表.
  
  示例所用的表及數(shù)據(jù)使用Oracle隨機(jī)demo表emp.
  
  注重: 受varchar2的長度限制, 列的取值的總長度是有限制的, 在方法3中也有同樣的問題.
  
  下面是函數(shù)及其運(yùn)行結(jié)果
  
  create or replace
  
  function list_func1( p_dept in varchar2 )
  
  return varchar2
  
  is
  
  l_str varchar2(4000) default null;
  
  l_sep varchar2(2) default null;
  
  begin
  
  for x in ( select empno from emp where deptno = p_dept ) loop
  
  l_str := l_str l_sep to_char(x.empno);
  
  l_sep := ', ';
  
  end loop;
  
  return l_str;
  
  end;
  
  /
  
  scott@ORCL> column emplist format a60
  
  scott@ORCL> select deptno, emplist1(deptno) emplist
  
  2 from emp
  
  3 group by deptno
  
  4 /
  
  DEPTNO EMPLIST
  
  ---------- ------------------------------------------------------------
  
  10 7782, 7839, 7934
  
  20 7369, 7566, 7788, 7876, 7902
  
  30 7499, 7521, 7654, 7698, 7844, 7900
  
  scott@ORCL>
  
  3.    動態(tài)SQL
  
  這種方法由于使用動態(tài)sql, 相對來說比較復(fù)雜, 但與此同時(shí), 它比其方法2來說功能大大增強(qiáng): 它可以用于任意表, 并可以連接表中的任意列.
  
  函數(shù)代碼:
  
  create or replace
  
  function list_func2( p_key_name in varchar2,
  
  p_key_val in varchar2,
  
  p_other_col_name in varchar2,
  
  p_tname   in varchar2 )
  
  return varchar2
  
  as
  
  type rc is ref cursor;

  
  l_str  varchar2(4000);
  
  l_sep  varchar2(2);
  
  l_val  varchar2(4000);
  
  l_cur  rc;
  
  begin
  
  open l_cur for 'select 'p_other_col_name'
  
  from ' p_tname '
  
  where ' p_key_name ' = :x '
  
  using p_key_val;
  
  loop
  
  fetch l_cur into l_val;
  
  exit when l_cur%notfound;
  
  l_str := l_str l_sep l_val;
  
  l_sep := ', ';
  
  end loop;
  
  close l_cur;
  
  return l_str;
  
  end;
  
  /
  
  參數(shù)說明:
  
  p_key_name -       查詢依據(jù)的列名
  
  p_key_val -        查詢依據(jù)的列名所對應(yīng)的列值
  
  p_other_col_name -   要連接成列表的列名
  
  p_tname -         表名
  
  下面是運(yùn)行結(jié)果:
  
  scott@ORCL> column emplist format a60
  
  scott@ORCL> select DEPTNO,
  
  2   list_func2('DEPTNO', DEPTNO, 'EMPNO', 'EMP') emplist
  
  3 from emp
  
  4 group by deptno
  
  5 /
  
  DEPTNO EMPLIST
  
  ---------- --------------------------------------------------
  
  10 7782, 7839, 7934
  
  20 7369, 7566, 7788, 7876, 7902
  
  30 7499, 7521, 7654, 7698, 7844, 7900

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 缙云县| 会同县| 武鸣县| 中江县| 故城县| 普兰店市| 长春市| 昌乐县| 于田县| 安丘市| 抚远县| 汤阴县| 凤凰县| 河池市| 平原县| 海林市| 郯城县| 定远县| 马公市| 竹山县| 邮箱| 巴中市| 文登市| 高密市| 西乡县| 固原市| 若尔盖县| 平原县| 奉贤区| 郑州市| 无为县| 益阳市| 文化| 高雄县| 英山县| 廊坊市| 钦州市| 姜堰市| 都安| 嘉兴市| 娄底市|