【问题标题】:SQL Syntax QuerySQL 语法查询
【发布时间】:2020-11-07 11:15:33
【问题描述】:

谁能告诉我这里的语法哪里出错了?

我有这个返回 26 行的查询

SELECT firstname, lastname
  FROM author 
  WHERE authorid IN (
  SELECT authorid
  FROM written_by
  JOIN book ON written_by.bookdescid = book.bookdescid
  WHERE UPPER (book.title) LIKE UPPER ('%electric%')
  AND NOT UPPER (written_by.role) LIKE UPPER('%translator%'));

这似乎是正确的,我使用 UPPER 和 ('%example%') 这样的原因是为了改变大小写。

但是,当我尝试添加到查询中以获取书的副标题还包含“电”的位置时,由于返回的行数较少,我不知怎么弄错了语法?如果有的话,它应该是相同的或更多的......我尝试了一些变化,但下面的这个是我认为可行的......

SELECT firstname, lastname
  FROM author 
  WHERE authorid IN (
  SELECT authorid
  FROM written_by
  JOIN book ON written_by.bookdescid = book.bookdescid
  WHERE UPPER (book.title) OR (book.subtitle) LIKE UPPER ('%electric%')
  AND NOT UPPER (written_by.role) LIKE UPPER('%translator%'));

【问题讨论】:

  • 您认为这有什么作用以及为什么?如果您尝试根据(权威)文档(或者,作为初学者,甚至是介绍)来证明您的期望是合理的,您会发现您做不到。人们应该始终阅读手册以了解正在使用的功能。 OR 需要 2 个条件,优先级低于 LIKE。 PS 对于代码问题,需要minimal reproducible example。其中包括有理由的期望。还有像select * from t where x or y like 'A' 这样的问题的最小代码会显示问题是OR vs LIKE。或 OR vs = 更小。

标签: sqlite syntax


【解决方案1】:

您必须使用带有运算符LIKE的单独表达式:

  WHERE ((UPPER(book.title) LIKE '%ELECTRIC%') OR (UPPER(book.subtitle) LIKE '%ELECTRIC%'))
  AND (UPPER(written_by.role) NOT LIKE '%TRANSLATOR%');

也只对列使用UPPER(),并提供大写的字符串文字。

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 2010-10-29
    • 2018-09-13
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2012-04-18
    相关资源
    最近更新 更多