как превратить sql нулевое значение в число? - PullRequest
0 голосов
/ 10 июля 2020

Я присоединился к таблице, а затем превратил ее в такой массив

введите описание изображения здесь

поэтому в массиве номер 1 и 2 в базе данных нет элемента, поэтому qty_stock вернул ноль

есть ли способ превратить ноль на qty_stock в номер 0?

вот мой код

$getmaterial = ContractProduct::select(
        'contract_product.ref_contract_id',
        'contract_product.ref_product_id',
        'product_item.name as product_name',
        'contract_product.qty as qty_taken',
        'stock.qty_stock',
        'contract_product.unit_price as price',
        'contract_product.sub_total_price as budget',
        \DB::raw('ABS(stock.qty_stock - contract_product.qty) as qty')
      )
      ->leftjoin('contract_document', 'contract_product.ref_contract_id', '=', 'contract_document.contract_id')
      ->leftjoin('product_item', 'contract_product.ref_product_id', '=', 'product_item.code')
      ->leftjoin('stock', 'contract_product.ref_product_id', '=', 'stock.ref_product_id')
      ->where('contract_document.ref_project_id', $getquoid->project_id)
      ->get();

Ответы [ 4 ]

2 голосов
/ 10 июля 2020

Используйте COALESCE():

coalesce(stock.qty_stock, 0) as qty_stock

COALESCE() - стандартная функция SQL для замены NULL значений. Он возвращает первое значение, которое не является NULL его аргументами - может быть любое количество аргументов.

1 голос
/ 10 июля 2020

Я рекомендую сделать это с переменной $getmaterial вместо того, чтобы делать это с помощью Query Builder (т.е. используя COALESCE):

Где бы вы ни использовали qty_stock, вы можете просто сказать:

print($getmaterial[0].qty_stock | 0);

Это мое любимое решение для подобных случаев. Это не заменит все NULL значения qty_stock в массиве, но будет использовать 0, когда вы поместите | 0 после каждого NULL значения (также работает для false, undefined, 0 et c. Практически все возможные false значения).

Если вы действительно хотите заменить все NULL значения внутри вашего $getmaterial массива , Я рекомендую использовать for-l oop:

for ($i = 0; $i < $getmaterial->count(); $i++) {
    $getmaterial[i].qty_stock = $getmaterial[i].qty_stock | 0;
}

// or:

for ($i = 0; $i < $getmaterial->count(); $i++) {
    if ($getmaterial[i].qty_stock == null) {
        $getmaterial[i].qty_stock = 0;
    }
}

Какой вам больше нравится. Однако последний не очень эффективен, когда ваш массив содержит много элементов. Но если это действительно так, вам следует разбить свой запрос на страницы: https://laravel.com/docs/7.x/pagination.

0 голосов
/ 02 августа 2020

Вы можете использовать IFNULL() или COALESCE() для этой цели, оба работают одинаково.

IFNULL(stock.qty_stock, 0) as qty_stock

OR

COALESCE(stock.qty_stock, 0) as qty_stock

Оба возвращают 0 для нулевого qty_stock.

И если вы хотите 1 для нулевого qty_stock, у вас есть еще один вариант вместе с этими двумя.

ISNULL(stock.qty_stock) as qty_stock

Это вернет 1 для нулевого qty_stock.

0 голосов
/ 10 июля 2020

Если вы хотите заменить NULL на 0, вы можете использовать COALESCE или CASE WHEN

CASE WHEN stock.qty_stock is not null then stock.qty_stock else 0 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...