【问题】:
我们在对服务活动记录进行查询时,往往通过右键进行查看数据,然后点击查看附加信息中的信息,但是偶尔很多人就疑问,这里面数据丢失了?
可能会造成不了解的人误认为是产品BUG导致节点丢失。
最近有好几个人都在问怎么查看服务活动记录里面附加信息的所有信息?其实这个问题之前 我也是从常哥那里知道的,个别也问了我好几遍。
为了能够促进大家对XMLTYPE字段查询知识,这里简单的给大家分享一下我们实际应用过程中常用的语句。
【分析及处理】:
分析对象:服务活动记录.附加信息
SQL1:select t.附加信息.getclobval() 附加信息 from 服务活动记录 t
注:通过右键查看数据自动生成,这种方式无法全部查看内容较多的节点信息(这里大家也会发现,只有存在大字段的时候才会自动将表字段全部列举出来)。
SQL2:select extract(附加信息,'/*').getclobval() as 附加信息 from 服务活动记录 t
注:这种方式可以查看大字段所有内容包括节点信息;
SQL3:select extract(附加信息,'/*').getstringval() as 附加信息 from 服务活动记录 t
【注1】:getstringval() 直接返回string类型值,但是当附加信息中内容过多时,会出现字 符缓冲区太小的错误提示,所以目前比较少用。
【注2】:这里还有getnumberval() 获取数值,内容存在字符时报无效数字,getrootElement ()获取字段根节点 root,这个也可以用来判断XMLtype字段中是否存在对应跟节点。如下↓
SQL4:select id from 服务活动记录 where existsnode(附加信息,'root') =1
【注】:从执行计划上看 该方式cup消耗足足比下面【SQL5】的方式多了一位数
SQL5:select id from 服务活动记录 where extract(附加信息,'/*').getrootElement()='root'
【注】:获取根节点为root的记录,仅对跟节点作判断。
【注】:许多应用大多数是使用的existsnode相对简单一些。且通常用于判断是否存在根节点以下的节点或“节点值”,如下↓
SQL6:select id from 服务活动记录 where existsnode(附加信息,'root/record[event_type="入院"]/stay_number[text()="1103000386"]')=1
【注】:意思为是否存在住院号为:1103000386 的入院记录。
SQL7:select extractvalue(附加信息,'root/record[event_type="入院"]'/stay_number) from 服务活动记录 where rownum=1
select extractvalue(value(b),'record[event_type="入院"]/stay_number') from 服务活动记录 a,table(xmlsequence(extract(附加信息,'root/record'))) b
【注】:最普通的查询节点值方式,简单明了直接,第二条SQL尽量少用,仅当某节点下存在多个相同节点无法区分时可以考虑,存在多条记录可能导致整体查询数据重复。
SQL8:select p.住院号,p.床号,p.病况,p.住院次数 FROM 服务活动记录 t ,
XMLTable('for $i in root/record
where $i/event_type = "入院"
return <record>
<stay_number>{$i/stay_number}</stay_number>
<bed_code>{$i/bed_code}</bed_code>
<condition>{$i/condition}</condition>
<stay_times>{$i/stay_times}</stay_times>
</record>'
PASSING 附加信息
COLUMNS 住院号 VARCHAR2(20) PATH '/record/stay_number/stay_number',
床号 Varchar2(10) path '/record/bed_code/bed_code',
病况 Varchar2(10) path '/record/condition/condition',
住院次数 Varchar2(10) path '/record/stay_times/stay_times'
) p where rownum=1
【注】:公卫用的比较多的查询方式,可以简写为↓:
select p.住院号,p.床号,p.病况,p.住院次数 FROM 服务活动记录 t ,
XMLTable('for $i in root/record
where $i/event_type = "入院"
return <record>
{$i/stay_number}
{$i/bed_code}
{$i/condition}
{$i/stay_times}
</record>'
PASSING 附加信息
COLUMNS 住院号 VARCHAR2(20) PATH '/record/stay_number',
床号 Varchar2(10) path '/record/bed_code',
病况 Varchar2(10) path '/record/condition',
住院次数 Varchar2(10) path '/record/stay_times'
) p where rownum=1;
以上是目前个人认为用的比较多的一些查询方式,仅供各位参考。
我们在对服务活动记录进行查询时,往往通过右键进行查看数据,然后点击查看附加信息中的信息,但是偶尔很多人就疑问,这里面数据丢失了?
可能会造成不了解的人误认为是产品BUG导致节点丢失。
最近有好几个人都在问怎么查看服务活动记录里面附加信息的所有信息?其实这个问题之前 我也是从常哥那里知道的,个别也问了我好几遍。
为了能够促进大家对XMLTYPE字段查询知识,这里简单的给大家分享一下我们实际应用过程中常用的语句。
【分析及处理】:
分析对象:服务活动记录.附加信息
SQL1:select t.附加信息.getclobval() 附加信息 from 服务活动记录 t
注:通过右键查看数据自动生成,这种方式无法全部查看内容较多的节点信息(这里大家也会发现,只有存在大字段的时候才会自动将表字段全部列举出来)。
SQL2:select extract(附加信息,'/*').getclobval() as 附加信息 from 服务活动记录 t
注:这种方式可以查看大字段所有内容包括节点信息;
SQL3:select extract(附加信息,'/*').getstringval() as 附加信息 from 服务活动记录 t
【注1】:getstringval() 直接返回string类型值,但是当附加信息中内容过多时,会出现字 符缓冲区太小的错误提示,所以目前比较少用。
【注2】:这里还有getnumberval() 获取数值,内容存在字符时报无效数字,getrootElement ()获取字段根节点 root,这个也可以用来判断XMLtype字段中是否存在对应跟节点。如下↓
SQL4:select id from 服务活动记录 where existsnode(附加信息,'root') =1
【注】:从执行计划上看 该方式cup消耗足足比下面【SQL5】的方式多了一位数
SQL5:select id from 服务活动记录 where extract(附加信息,'/*').getrootElement()='root'
【注】:获取根节点为root的记录,仅对跟节点作判断。
【注】:许多应用大多数是使用的existsnode相对简单一些。且通常用于判断是否存在根节点以下的节点或“节点值”,如下↓
SQL6:select id from 服务活动记录 where existsnode(附加信息,'root/record[event_type="入院"]/stay_number[text()="1103000386"]')=1
【注】:意思为是否存在住院号为:1103000386 的入院记录。
SQL7:select extractvalue(附加信息,'root/record[event_type="入院"]'/stay_number) from 服务活动记录 where rownum=1
select extractvalue(value(b),'record[event_type="入院"]/stay_number') from 服务活动记录 a,table(xmlsequence(extract(附加信息,'root/record'))) b
【注】:最普通的查询节点值方式,简单明了直接,第二条SQL尽量少用,仅当某节点下存在多个相同节点无法区分时可以考虑,存在多条记录可能导致整体查询数据重复。
SQL8:select p.住院号,p.床号,p.病况,p.住院次数 FROM 服务活动记录 t ,
XMLTable('for $i in root/record
where $i/event_type = "入院"
return <record>
<stay_number>{$i/stay_number}</stay_number>
<bed_code>{$i/bed_code}</bed_code>
<condition>{$i/condition}</condition>
<stay_times>{$i/stay_times}</stay_times>
</record>'
PASSING 附加信息
COLUMNS 住院号 VARCHAR2(20) PATH '/record/stay_number/stay_number',
床号 Varchar2(10) path '/record/bed_code/bed_code',
病况 Varchar2(10) path '/record/condition/condition',
住院次数 Varchar2(10) path '/record/stay_times/stay_times'
) p where rownum=1
【注】:公卫用的比较多的查询方式,可以简写为↓:
select p.住院号,p.床号,p.病况,p.住院次数 FROM 服务活动记录 t ,
XMLTable('for $i in root/record
where $i/event_type = "入院"
return <record>
{$i/stay_number}
{$i/bed_code}
{$i/condition}
{$i/stay_times}
</record>'
PASSING 附加信息
COLUMNS 住院号 VARCHAR2(20) PATH '/record/stay_number',
床号 Varchar2(10) path '/record/bed_code',
病况 Varchar2(10) path '/record/condition',
住院次数 Varchar2(10) path '/record/stay_times'
) p where rownum=1;
以上是目前个人认为用的比较多的一些查询方式,仅供各位参考。