За последние 24 часа нас посетили 21558 программистов и 1032 робота. Сейчас ищут 689 программистов ...

Можно ли во время LEFT JOIN проверить на NULL ?

Тема в разделе "PHP и базы данных", создана пользователем Artur_hopf, 22 янв 2019.

  1. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Добрый день. Есть запрос такого вида:
    PHP:
    1. $query->select();
    2. $query->from('Database DT');
    3. $query->leftjoin('Users AS US', 'DT.Name = US.Id');
    4. //$query->where(['not', ['DT.Name' => null]]);
    5. $query->orderBy('DT.Start_date DESC');
    6. $query->limit(1);
    7. $result = $query->all();
    8. if(count($result) > 0){
    9.     return $result;
    10. }else{
    11.     return false;
    12. }
    В данном случае если вдруг поле DT.Name будет пустое (NULL) то выйдет ошибка
    Ошибка при преобразовании строки символов в тип uniqueidentifier

    Подскажите как прописать если DT.Name == NULL то и вывести NULL а не пытаться вытянуть данные из таблицы Users.
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Или как то по другому может подскажите как пользователя подставлять, проверяя на NULL.
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Artur_hopf, попробуйте, например, coalesce() для подстановки пустой строки вместо значения null
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    так условие пропиши дополнительное, чтоб для таких не искал
    Код (Text):
    1. $query->where(['not', ['DT.Name' => null]]);
    только синтаксис не знаю для твоего билдера
    для чистого запроса - NOT DT.name IS NULL
     
  5. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @ADSoft В том то и дело он должен найти даже с нулем, просто не пытаться подставить значение.
    Пробовал так написать, серавну шляпа с этой ошибкой:
    PHP:
    1. $query->select();
    2. $query->from('Database DT');
    3.  
    4. $subQuery = $query2->select('FIO')->from('Users AS US')->where('DT.Name = US.Id');
    5.  
    6. $query->leftjoin('Users AS US', 'DT.Name = US.Id');
    7. //$query->where(['not', ['DT.Name' => null]]);
    8.  
    9. $query->where(['not exists', $subQuery]);
    10.  
    11. $query->orderBy('DT.Start_date DESC');
    12. $query->limit(1);
    13. $result = $query->all();
    14. if(count($result) > 0){
    15.     return $result;
    16. }else{
    17.     return false;
    18. }
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    В ssms протестил, проблема оказалось в WHERE после LEFT JOIN. Думаю разберусь дальше, всем спасибо :)
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    @Artur_hopf как интересно ты условие left join записываешь! Так работает?! Вообще-то в элоквент принято писать всё раздельно:
    https://laravel.com/docs/5.7/queries#joins

    ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
    --- Добавлено ---
    Поиск пустого или непустого значения делают через whereNull() и whereNotNull()
    Смотри те же доки.
    --- Добавлено ---
    Перенес тему в Laravel. обознался, потом исправился.
    Как по мне, если бы вопрос касался базы, а не конкретного построителя запросов, то надо было отлаживать запрос на чистом SQL.
     
    #7 artoodetoo, 24 янв 2019
    Последнее редактирование: 24 янв 2019
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @artoodetoo не, я разобрался. Там была проблема в том что тип столба DT.Name был nvarchar, переделал его в uniqueidentifier и ошибка ушла.

    Я в yii2 пример привел, там так можно =)
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    О! Сорри тогда )
    --- Добавлено ---
    Похоже очень. Эктив рекордс такие эктив рекордс!
     
  10. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    PHP:
    1. $q->where(['is', 'column', null]) // В yii null не приводить к строке
     
    Artur_hopf нравится это.