Этот запрос по-прежнему возвращает пустое поле заголовка?

#mysql #sql #select

#mysql #sql #выберите

Вопрос:

этот запрос работает отлично, кроме того, что он по-прежнему возвращает пустые поля заголовка:

 SELECT
    DISTINCT( TRIM( LEFT(title, 
    IF( LOCATE('10 Pack', title), LOCATE('10 Pack', title) - 1, 
    IF( LOCATE('100 Classic', title), LOCATE('100 Classic', title) - 1, 
    IF( LOCATE('100 Favourite', title), LOCATE('100 Favourite', title) - 1, 
    IF( LOCATE('DVD', title), LOCATE('DVD', title) - 1,
    IF( LOCATE('Bluray', title), LOCATE('Bluray', title) - 1,
    IF( LOCATE('Series', title), LOCATE('Series', title) - 1,
    IF( LOCATE('20 ', title), LOCATE('20 ', title) - 1,
999 )))))))))), 
    main_category, 
    genre, 
    actors
FROM 
    PRprodINFO 
WHERE
    ((main_category = 'Films') 
    AND (length(title) > 2)) 
GROUP BY title
  

также пробовал:

 SELECT 
    DISTINCT( TRIM( LEFT(title, 
    IF( LOCATE('10 Pack', title), LOCATE('10 Pack', title) - 1, 
    IF( LOCATE('100 Classic', title), LOCATE('100 Classic', title) - 1, 
    IF( LOCATE('100 Favourite', title), LOCATE('100 Favourite', title) - 1, 
    IF( LOCATE('DVD', title), LOCATE('DVD', title) - 1,
    IF( LOCATE('Bluray', title), LOCATE('Bluray', title) - 1,
    IF( LOCATE('Series', title), LOCATE('Series', title) - 1,
    IF( LOCATE('20 ', title), LOCATE('20 ', title) - 1,
999 )))))))))),
    main_category, 
    genre, 
    actors
FROM
    PRprodINFO
where 
    ((main_category = 'Films')
    AND (title <> ''))
GROUP BY title
  

но все равно возвращаются пустые строки поля заголовка…есть идеи, почему?

Спасибо

Даррен

Комментарии:

1. Можете ли вы привести несколько примеров типичных строк в PRprodINFO таблице? Особенно title столбец. Кроме того, какова цель вашего запроса?

Ответ №1:

Если поле есть null , то LOCATE(astr, field) вернет значение null. Вам нужно убедиться title , что значение не равно null .
Либо замените title на COALESCE(title) везде, либо сделайте:

 SELECT DISTINCT( TRIM( LEFT(i.title, 
  IF( LOCATE('10 Pack', i.title), LOCATE('10 Pack', i.title) - 1, 
  IF( LOCATE('100 Classic', i.title), LOCATE('100 Classic', i.title) - 1, 
  IF( LOCATE('100 Favourite', i.title), LOCATE('100 Favourite', i.title) - 1, 
  IF( LOCATE('DVD', i.title), LOCATE('DVD', i.title) - 1,
  IF( LOCATE('Bluray', i.title), LOCATE('Bluray', i.title) - 1,
  IF( LOCATE('Series', i.title), LOCATE('Series', i.title) - 1,
  IF( LOCATE('20 ', i.title), LOCATE('20 ', i.title) - 1,999 ))))))))))
  , i.main_category, i.genre, i.actors 
FROM (SELECT main_category, genre, actors, COALESCE(title,'') as title 
      FROM PRprodINFO) i 
WHERE ((i.main_category = 'Films') AND (length(i.title) > 2)) 
GROUP BY i.title
  

Ответ №2:

Я бы добавил следующее к вашему предложению WHERE…

 AND Length( TRIM( NVL(title, '' ))) > 2
  

вместо вашего

 AND (title <> '' )
  

Если у вас есть какие-либо нулевые значения, они отбросят его, кроме того, если заголовок имеет значение » «, это тоже может дать ложное срабатывание. Итак, выполнив NVL() (если значение null, используйте «), затем обрезав его, а затем проверив длину… вы должны получить все необходимое для ваших нужд.

Ответ №3:

Попробуйте изменить свой массивный IF блок так, чтобы он возвращался title , когда ни одно из условий не выполнено. Каковы результаты?

 SELECT 
    DISTINCT( TRIM( LEFT(title, 
    IF( LOCATE('10 Pack', title), LOCATE('10 Pack', title) - 1, 
    IF( LOCATE('100 Classic', title), LOCATE('100 Classic', title) - 1, 
    IF( LOCATE('100 Favourite', title), LOCATE('100 Favourite', title) - 1, 
    IF( LOCATE('DVD', title), LOCATE('DVD', title) - 1,
    IF( LOCATE('Bluray', title), LOCATE('Bluray', title) - 1,
    IF( LOCATE('Series', title), LOCATE('Series', title) - 1,
    IF( LOCATE('20 ', title), LOCATE('20 ', title) - 1,
999 )))))), title )))),
    main_category, 
    genre, 
    actors
FROM
    PRprodINFO
where 
    ((main_category = 'Films')
    AND (title <> ''))
GROUP BY title