2012-04-03 84 views
3

我有一個從數據庫獲取XML的簡單問題。現在,這個XML可以在它裏面沒有值,如下所示:如何檢查XML是否在SQL中有價值?

<TryXML xmlns=""> 
<TryXML_XML_VERSION>1.0</TryXML_XML_VERSION> 
<TITLE_DESC /> 
<ISCI_CODE /> 
<PRODUCT_DESC /> 
<PLAY_LENGTH /> 
<START_TIME /> 
<COMPRESSION_LEVEL_CODE /> 
<ENCODER_TYPE_DESC /> 
<OUTPUT_RATE /> 
<FRAME_RATE /> 
<FILE_NAME /> 
<FILE_SIZE /> 
<COPY_DATE /> 
<ADVERTISER /> 
<AGENCY_VENDOR /> 
</TryXML> 

,或者它可能有價值觀裏面,像這樣

<TryXML xmlns=""> 
<TryXML_XML_VERSION>1.0</TryXML_XML_VERSION> 
<TITLE_DESC>asd</TITLE_DESC> 
<ISCI_CODE>asd</ISCI_CODE> 
<PRODUCT_DESC>sd</PRODUCT_DESC> 
<PLAY_LENGTH>asdklgh</PLAY_LENGTH> 
<START_TIME>sdghkl</START_TIME> 
<COMPRESSION_LEVEL_CODE /> 
<ENCODER_TYPE_DESC /> 
<OUTPUT_RATE /> 
<FRAME_RATE /> 
<FILE_NAME>sdfgjkl</FILE_NAME> 
<FILE_SIZE /> 
<COPY_DATE /> 
<ADVERTISER>sdfgklj</ADVERTISER> 
<AGENCY_VENDOR>sdfgjkl</AGENCY_VENDOR> 
</TryXML> 

我如何檢查是否表示XML節點具有值或不?注意:值可以是任何字母數字。

回答

4

假設你正在使用SQL Server,你可以使用value

declare @t table (col1 xml) 
insert @t values ('<root><a>val</a></root>') 
insert @t values ('<root><a></a></root>') 
insert @t values ('<root><a/></root>') 
insert @t values ('<root></root>') 

select * 
from @t 
where col1.value('(/root/a)[1]','varchar(50)') <> '' 

這隻能說明第一行,其中/root/a有一個值。正如評論請用case一個例子:

select case 
     when col1.value('(/root/a)[1]','varchar(50)') is null then 'Null' 
     else 'Not Null' 
     end 
from @t 

Example at SE.Data.

+0

我可以在case語句中使用它並將它與IS NOT NULL進行比較嗎? – Nathan 2012-04-03 07:20:28

+0

當然,例子添加到回答 – Andomar 2012-04-03 07:25:44

+0

救星。謝謝:) +1 – Si8 2015-10-14 16:36:25

0

如果問題是,如何識別(和區分)空字符串「空」 -fields和領域,你應該考慮重新設計數據庫表和導出腳本:

1)在數據庫表中引入「空白」字段。

2)

  • 如果字段有一個 「空」 值,完全不出口這個領域。

  • 如果一個字段有一個空字符串,請將其導出 - 就像您現在正在做的那樣。