如果一个表列为空,如何从另一个表中获取值
Posted
技术标签:
【中文标题】如果一个表列为空,如何从另一个表中获取值【英文标题】:How to get the value from the other table if one table column is empty 【发布时间】:2019-05-25 09:36:48 【问题描述】:我的数据库中有两个表
-
产品
product_variations
两者都有价格列。
如果任何产品有变体,则 产品表 的 price 列将被取消,并且 variation 中的 price 列表会有一些价值。
但如果产品没有变化,那么产品表的 price 列将具有一些值,但 variation 表中的 price 列将没有价值
我想获取所有价格从低到高的产品,反之亦然。
$shopProducts = product::where(
[
"publish" => 'PUBLISH',
'shop_id' => input::get('shopId')
]
)->orderBy('price', 'asc')
->paginate(12);
上述查询返回正确的所有产品,并将所有那些有变化且价格列为空的产品放在最后。
但我想要一个查询,它首先检查产品的价格列,如果它为空,然后转到产品变化表并搜索一个值,然后以 desc 或 asc 的形式返回结果。
【问题讨论】:
您是否需要,例如。如果产品的价格为零,那么获取该产品的所有变体并加入结果? 是的,我需要这样的解决方案 【参考方案1】:我不知道使用查询构建器执行此操作的完全本地方式,但如果您使用的是 sql 数据库,您应该能够使用原始 case 语句执行此操作。比如……
$shopProducts = product::SELECT(
DB::raw("CASE WHEN product_variations.price IS NULL THEN product.price ELSE product_variations.price END AS price")
)->where(
[
"publish" => 'PUBLISH',
'shop_id' => input::get('shopId')
]
)->orderByRaw('CASE WHEN product_variations.price IS NULL THEN product.price ELSE product_variations.price END', 'asc')
->paginate(12);
这应该适用于 mssql 或 mysql,并且大多数数据库都支持某种类型的类似语法。您只需要在您的选择语句中添加任何您想要的其他列。您还需要加入您的 product_variations 表才能使用此方法。
原始选择和原始顺序都绕过 Laravel 的查询构建器并将您的语句直接传递到数据库,因此请注意构建查询的方式。 Laravel 不会为你清理这些。
【讨论】:
以上是关于如果一个表列为空,如何从另一个表中获取值的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个工作表中获取单元格值并将其分配给 UDF 的返回值?
如果 Oracle OBIEE 中的列为空,则隐藏数据透视表中的列