查询可以在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
。
当查询返回非空表时,我希望它看起来与原始查询完全一样。因此,不应该添加任何列或更改结果的架构。
答案 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