Ошибки синтаксиса регистра
Здравствуйте, я пытаюсь сделать это с 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;