我有这个问题:
SELECT COUNT(articles.id) AS count
FROM articles, xml_documents, streams
WHERE articles.xml_document_id = xml_documents.id
AND xml_documents.stream_id = streams.id
AND articles.published_at BETWEEN '2010-01-01' AND '2010-04-01'
AND streams.brand_id = 7
通过在FROM子句中指定csv格式的三个表来使用默认的equajoin。我需要做的是将其分配在articles.source(raw xml)中找到的值..所以它可以变成这个:
SELECT COUNT(articles.id) AS count, ExtractValue(articles.source, "/article/media_type") AS media_type
FROM articles, xml_documents, streams
WHERE articles.xml_document_id = xml_documents.id
AND xml_documents.stream_id = streams.id
AND articles.published_at BETWEEN '2010-01-01' AND '2010-04-01'
AND streams.brand_id = 7
GROUP BY media_type
工作正常,问题是,我正在使用rails,并使用STI作为xml_documents表。提供给 ExtractValue 方法的 articles.source 将有几种不同的格式。所以我需要做的是使用“/ article / media_type “IF xml_documents.type ='source one'并使用”/ article / source“如果xml_documents.type ='source two'
这只是因为两种文档类型的XML格式不同,但我不想运行多个查询来检索这些信息。
如果可以使用三元运算符会很好,但我不认为这是可能的..
修改 在这一点,我正在寻找一个临时表,或者只是使用UNION将多个结果集放在一起..
答案 0 :(得分:3)
这样的事情:
SELECT COUNT(articles.id) AS count,
ExtractValue(articles.source,
CASE xml_documents.type WHEN 'source one' then '/article/media_type'
WHEN 'source two' then '/article/source'
ELSE 'error'
END),
FROM ...
击> <击> 撞击> 的修改 试试这个:
SELECT COUNT(articles.id) AS count,
CASE xml_documents.type WHEN 'source one' THEN ExtractValue(articles.source, '/article/media_type')
WHEN 'source two' THEN ExtractValue(articles.source, '/article/source')
ELSE NULL
END as media_type,
...
答案 1 :(得分:0)
我会支持上一张海报:
SELECT
COUNT(articles.id) AS count,
(CASE xml_documents.type
WHEN 'source one' THEN ExtractValue(articles.source, '/article/media_type')
WHEN 'source two' then ExtractValue(articles.source, '/article/source')
ELSE NULL
END) as media_type,
FROM ...