Ошибки синтаксиса регистра

Здравствуйте, я пытаюсь сделать это с MySQL. Я пытался использовать SELECT IF и CASE, чтобы изменить названия. Каждое описание заголовка имеет "A " перед описанием; даже если второе слово начинается с согласного. Поэтому я пытаюсь запросить описания, но отредактирую те, которые имеют начальную согласную, чтобы начать с "An ".

CASE
    WHEN description LIKE ('A A%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))
    WHEN description LIKE ('A E%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))
    WHEN description LIKE ('A I%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))
    WHEN description LIKE ('A O%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))
    WHEN description LIKE ('A U%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))
END;

Так что именно этот код только что дал мне код ошибки: 1064 синтаксис.

SELECT IF(description NOT LIKE ('A A%'), NULL, CONCAT('An ', TRIM(LEADING 'A ' FROM description))),
    IF(description NOT LIKE ('A E%'), null, CONCAT('An ', TRIM(LEADING 'A ' FROM description))),
    IF(description NOT LIKE ('A I%'), NULL, CONCAT('An ', TRIM(LEADING 'A ' FROM description))),
    IF(description NOT LIKE ('A O%'), NULL, CONCAT('An ', TRIM(LEADING 'A ' FROM description))),
    IF(description NOT LIKE ('A U%'), NULL, CONCAT('An ', TRIM(LEADING 'A ' FROM description)))
FROM film_text;    

Этот конкретный блок кода возвращает отдельные столбцы, однако я пытаюсь запросить все это в одном столбце.

Что возвращает мой блок IF:

2 ответа

Не используйте скобки вокруг терминов в вашем LIKE выражения. Это, вероятно, причина синтаксической ошибки, которую вы видите. Вместо этого попробуйте использовать это CASE выражение, имеющее только одно условие:

SELECT CASE WHEN UPPER(description) NOT LIKE 'A A%' AND
                 UPPER(description) NOT LIKE 'A E%' AND
                 UPPER(description) NOT LIKE 'A I%' AND
                 UPPER(description) NOT LIKE 'A O%' AND
                 UPPER(description) NOT LIKE 'A U%'
            THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))   -- replace A with An
            ELSE description      -- otherwise use original description
       END AS description
FROM yourTable

Вы также можете использовать REGEXP здесь с классом отрицательных символов [^aeiou] чтобы соответствовать названиям, не начинающимся с гласной:

SELECT CASE WHEN description REGEXP '^A [^aeiou]'
            THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))
            ELSE description
       END AS description
FROM yourTable

Ваш вопрос действительно несколько вопросов.

Чтобы получить данные из нескольких "столбцов", возвращаемых как один столбец, вы должны использовать отдельные запросы и использовать UNION, между ними.

Но это не твоя проблема.

Может быть, лучше сделать проверку ("если") в WHERE пункт, и замена только один раз в SELECT,

Это не проверено, но может приблизить вас к тому, что вы хотите:

SELECT 
  CONCAT('An ', TRIM(LEADING 'A ' FROM description)) AS descrip
FROM film_text
WHERE description REGEXP '^A [aeiou]';    

REGEXP проверка, которую вы пытались выполнить в вашем CASE и ограничивает результирующий набор только этими строками.

Чтобы сделать все это и вернуть все описания, вы можете объединить REGEX синтаксис с CASE ты изначально пробовал.

SELECT 
  CASE WHEN description REGEXP '^A [aeiou]'
    THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))
    ELSE description
  END AS description
FROM film_text;
Другие вопросы по тегам