如果查询在BigQuery中没有记录,则显示默认值

时间:2018-06-05 20:36:01

标签: sql google-bigquery

查询可以在BigQuery上返回一个空表。这种情况的一个例子是,如果I join在BigQuery的查询中有一堆表,并且连接的结果是一个空表,或者没有基于where子句的匹配。< / p>

这是一个总是在空连接中返回的哑样本查询:

#standardSQL
WITH query1 AS (
    SELECT 1 AS number, "one" AS message
), query2 AS (
    SELECT 2 AS number, "two" AS message)
SELECT "query result" AS result, query1.* 
FROM query1
JOIN query2 ON query1.number = query2.number;

查询将显示此输出:Query returned zero records.

如果是这种情况,我想要返回消息或默认行。但我不知道该怎么做。我尝试过使用IFNULL,但这只适用于一列,而不是列数。使用IF语句给出了错误,因为您无法从if语句返回行。 我认为它给我的错误是Scalar subquery cannot have more than one column unless using SELECT AS STRUCT to build STRUCT values

我能想到的另一件事,但不知道如何实现的是在末尾添加UNION,只有在前面的部分没有返回任何内容时才会触发。或者将现有查询包装在WITH语句子查询中,如果没有返回任何内容,则打印一条消息,否则执行SELECT * FROM sub_query

我想要在结果为空表时显示消息,或者返回具有某些默认值的行。 我理解答案可能包含UNION语句,因此只显示一条消息是不可能的。在这种情况下,我想显示一个默认行。对于上面的示例查询,默认行看起来像:"No results found", NULL, NULL。 当查询返回非空表时,我希望它看起来与原始查询完全一样。因此,不应该添加任何列或更改结果的架构。

2 个答案:

答案 0 :(得分:4)

您将使用union all。像这样:

with t as (
      . . . <all your query stuff here>
     )
select cast(NULL as string) as msg, t.*
from t
union all
select msg, t.*  -- all the `t` columns will be `NULL`
from (select 'No rows returned' as msg) left join
     t
     on 1 = 0  -- always false
where not exists (select 1 from t);

注意并发症。查询返回一组固定的列,其中包含一组固定的名称。此版本在数据的开头返回一个额外的列以包含该消息。为了获得所有其余列,使用left join,但on子句始终为false。

答案 1 :(得分:2)

选项1

如果没有为your_query

返回结果,则下面显示包含所有空值的行     
class ViewController: UIViewController {

    @IBOutlet weak var collectionView: CollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.go()
    }

    func activeIndex()->Int?{
        if let selectedItems = self.collectionView.indexPathsForSelectedItems {
            if selectedItems.count > 0{
                return selectedItems[0].row
            }
        }
        return nil
    }
}

class Cell: UICollectionViewCell {

    @IBOutlet weak var myLabel: UILabel!

    override var isSelected: Bool{
        didSet{
            if self.isSelected
            {
                myLabel.text = "active"
            }
            else
            {
                myLabel.text = "not active"
            }
        }
    }
}


class CollectionView: UICollectionView, UICollectionViewDelegate, UICollectionViewDataSource {
    func go() {
        delegate = self
        dataSource = self
    }

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 500
    }

    internal func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! Cell
        return cell
    }
}

选项2

如果你事先知道输出模式 - 下面返回默认行(假设#standardSQL WITH your_query AS ( ... ) SELECT * FROM your_query UNION ALL SELECT your_query.* REPLACE ("No results found" AS result) FROM (SELECT 1) LEFT JOIN your_query ON FALSE WHERE NOT EXISTS (SELECT 1 FROM your_query) Row result number message 1 No results found null null 默认为0,而#34;无#34;默认为number

message