2015-10-15 88 views
1

问题:当我运行下面的代码时,输​​出为浮点字段的XML,出现为0.000000000000000e + 000我希望它为空或因为它的XML根本不出现。从SQL处理空白浮点数问题

思考:我想COALESCE(c.ProductType,'')以及COALESCE(c.ProductType,'999')我与999想看看发生了什么,但是在这两种情况下<ProductType>从XML饲料无缘,但价值0.000000000000000e + 000仍会返回。

查询:如何处理XML,从SQL,其中浮动是空白

代码创建的:(显示两个节目,而不是全部)

USE DATABASE 

    SELECT  
      e.UPRN  
      ,c.ProductType AS ProductType 

      FROM TblTable e(NOLOCK) 
     JOIN 
     TblAsbestos c (NOLOCK) 
     ON e.UPRN = c.UPRN 

     WHERE e.UPRN = 'SH1266' 

    FOR XML PATH('XML_DATA') , ROOT ('SURVEYDATA') 

XML输出:

<SURVEYDATA> 
    <XML_DATA> 
    <UPRN>SH1266</UPRN> 
    <LocationItemPosition>This works</LocationItemPosition> 
    <SurveyDate>2014-01-16T00:00:00</SurveyDate> 
    <SurveyCompany></SurveyCompany> 
    <ProductType>0.000000000000000e+000</ProductType> 
    </XML_DATA> 
</SURVEYDATA> 
+1

哪个RDBMS是这个呢?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –

+0

我不确定为什么有人投票关闭,因为我一直无法在Stackoverflow上找到它。如果有一个很好的答案链接。 – indofraiser

+0

浮动不能为空。它可以是NULL或0.如果你将一个空字符串转换为一个浮点数,它将被转换为0.作为附注,你对查询提示使用了不赞成使用的语法。 WITH关键字不再是可选的。一般来说,查询提示应该避免,除非你真的知道自己在做什么,并且所有其他选项都已经用尽。 NOLOCK提示特别讨厌。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

回答

1

请看看这个(SQL Server 2012的测试上,应该从2008年的工作)

DECLARE @tbl TABLE(UPRN VARCHAR(100),ProductType FLOAT); 
INSERT INTO @tbl VALUES('valid Float',123.45) 
         ,('Float is zero',0.0) 
         ,('Float is missing',NULL); 
SELECT * 
FROM @tbl AS tbl 
FOR XML PATH('XML_DATA'),ROOT('SURVEYDATA'); 

/* Result 
<SURVEYDATA> 
    <XML_DATA> 
    <UPRN>valid Float</UPRN> 
    <ProductType>1.234500000000000e+002</ProductType> 
    </XML_DATA> 
    <XML_DATA> 
    <UPRN>Float is zero</UPRN> 
    <ProductType>0.000000000000000e+000</ProductType> 
    </XML_DATA> 
    <XML_DATA> 
    <UPRN>Float is missing</UPRN> 
    </XML_DATA> 
</SURVEYDATA> 
*/ 

SELECT tbl.UPRN 
     ,CAST(tbl.ProductType AS DECIMAL(12,4)) AS ProductType 
FROM @tbl AS tbl 
FOR XML PATH('XML_DATA'),ROOT('SURVEYDATA'); 

/* Result with "nicer" numbers, but the empty one is missing... 
<SURVEYDATA> 
    <XML_DATA> 
    <UPRN>valid Float</UPRN> 
    <ProductType>123.4500</ProductType> 
    </XML_DATA> 
    <XML_DATA> 
    <UPRN>Float is zero</UPRN> 
    <ProductType>0.0000</ProductType> 
    </XML_DATA> 
    <XML_DATA> 
    <UPRN>Float is missing</UPRN> 
    </XML_DATA> 
</SURVEYDATA> 
*/ 

SELECT tbl.UPRN 
     ,CAST(tbl.ProductType AS DECIMAL(12,4)) AS ProductType,'' AS ProductType 
FROM @tbl AS tbl 
FOR XML PATH('XML_DATA'),ROOT('SURVEYDATA'); 

/* Result, "nicer" numbers and the empty one appears as empty tag. 
The trick: There are two elements with the same name and they are concatenated implicitly... 
Nothing plus an empty string is: the empty string! 
<SURVEYDATA> 
    <XML_DATA> 
    <UPRN>valid Float</UPRN> 
    <ProductType>123.4500</ProductType> 
    </XML_DATA> 
    <XML_DATA> 
    <UPRN>Float is zero</UPRN> 
    <ProductType>0.0000</ProductType> 
    </XML_DATA> 
    <XML_DATA> 
    <UPRN>Float is missing</UPRN> 
    <ProductType></ProductType> 
    </XML_DATA> 
</SURVEYDATA> 
*/ 
1

围绕c.ProductType添加一个NULLIF应该能够做到。

DECLARE @f FLOAT; SET @f = 0 

SELECT  
    'SH1266' as UPRN, 
    NULLIF(@f, 0.0) AS ProductType 
FOR XML PATH('XML_DATA') , ROOT ('SURVEYDATA') 

肖恩兰格评论以上虽然,浮子是一个名为ProductType列一个不寻常的数据类型。