#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