案例语法错误

时间:2017-01-18 02:17:50

标签: mysql if-statement case-statement

你好我试图用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 个答案:

答案 0 :(得分:1)

请勿在{{1​​}}表达式中围绕术语使用括号。这可能是您看到的语法错误的原因。相反,尝试使用只有一个条件的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]

答案 1 :(得分:0)

你的问题实际上是几个问题。

要将多个“列”中的数据作为单个列返回,您可以使用单独的查询并在它们之间使用UNION

但这不是你的问题。

最好在WHERE子句中进行检查(“if”),并在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;