如何检查BLOB列空值 过滤XMLQuery空结果并匹配指定文本
问题原因
你写的过滤条件不生效有两个核心原因:
- 条件里的
photoinfo指向的是原表存储BLOB格式XML的原生列,不是你SELECT子句中通过XMLQuery解析生成的别名为photoinfo的caption文本字段。原表的BLOB列本身存了XML内容、始终非空,这个判断自然筛不掉无caption的记录。 - SQL执行顺序中WHERE子句先于SELECT子句运行,本身就不支持直接在WHERE中引用SELECT里定义的列别名。
推荐写法
优先使用XMLExists直接在XML解析层做过滤,不需要提前提取文本值,性能更好,同时可以一步完成「caption节点存在」「文本包含another」两个判断:
SELECT PhotoNumber, XMLQuery( '/DataIM/caption[1]/text()' PASSING xmltype(photoinfo, 0) RETURNING CONTENT ).getstringval() "photoinfo" FROM ProfilePictures WHERE photosourcetype = 10 AND XMLExists( '/DataIM/caption[contains(., "another")]' PASSING xmltype(photoinfo, 0) )
如果你更习惯先提取字段值再做过滤,可以用子查询包装一层,注意不要让计算字段的别名和原表列重名,避免混淆:
SELECT * FROM ( SELECT PhotoNumber, XMLQuery( '/DataIM/caption[1]/text()' PASSING xmltype(photoinfo, 0) RETURNING CONTENT ).getstringval() caption_text FROM ProfilePictures WHERE photosourcetype = 10 ) WHERE caption_text IS NOT NULL AND caption_text LIKE '%another%'
以上两种写法执行后都会返回你预期的结果:
PHOTONUMBER | photoinfo ----------- | ------------ 44 | This is another photo
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

