首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >大小写语法错误

大小写语法错误
EN

Stack Overflow用户
提问于 2017-01-18 10:17:50
回答 2查看 52关注 0票数 2

你好,我正在尝试用mySQL来做这件事。我尝试使用SELECT IF和CASE来更改标题。每个标题描述的前面都有"A“;即使第二个单词以辅音开头。因此,我尝试查询描述,但编辑那些以辅音开头的描述,使其以"An“开头。

代码语言:javascript
复制
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语法。

代码语言:javascript
复制
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代码块返回了什么:

EN

回答 2

Stack Overflow用户

发布于 2017-01-18 10:28:13

不要在LIKE表达式中使用括号将术语括起来。这可能是您看到的语法错误的原因。相反,尝试使用只有一个条件的CASE表达式:

代码语言:javascript
复制
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]一起使用,以匹配不以元音开头的标题:

代码语言:javascript
复制
SELECT CASE WHEN description REGEXP '^A [^aeiou]'
            THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))
            ELSE description
       END AS description
FROM yourTable
票数 1
EN

Stack Overflow用户

发布于 2017-01-18 10:28:33

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

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

但这真的不是你的问题。

WHERE子句中进行检查( "if"),在SELECT中只进行一次替换可能会更好。

这是未经测试的,但可能会让你更接近你想要的:

代码语言:javascript
复制
SELECT 
  CONCAT('An ', TRIM(LEADING 'A ' FROM description)) AS descrip
FROM film_text
WHERE description REGEXP '^A [aeiou]';    

REGEXP执行您试图在CASE中执行的检查,并将结果集限制为仅这些行。

要完成整个操作并返回所有描述,您可以将REGEX语法与最初尝试的CASE结合使用。

代码语言:javascript
复制
SELECT 
  CASE WHEN description REGEXP '^A [aeiou]'
    THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description))
    ELSE description
  END AS description
FROM film_text;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41710316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档