【问题标题】:SQLite WHERE/IN clause - fails when string matches a column nameSQLite WHERE/IN 子句 - 当字符串与列名匹配时失败
【发布时间】:2020-05-08 03:13:55
【问题描述】:

我有一个问题:

SELECT mt.* FROM myTable as mt
WHERE mt."colName" IN ("PM")

它总是返回零行。但是,如果我改变它,使字符串在单引号中:

SELECT mt.* FROM myTable as mt
WHERE mt."colName" IN ('PM')

然后它返回所需的行。

提示:myTable 有一个名为“PM”的列。

因此,如果我在“colName”列中搜索带有字符串“ABC”的行,它将找到行。但是如果我添加一个名为“ABC”的列,那么除非我指定 ('ABC'),否则该查询也会失败。

为什么?

任何答案/解决方案都应考虑到 IN 列表的长度是任意的,并且将包含带有嵌入引号的字符串(单引号和双引号)。

此外,虽然此示例适用于 SQLite,但我的查询也必须适用于 Postgres。

【问题讨论】:

  • "PM" 指一列,'PM' 是(标准)SQL 中的字符串常量
  • 谢谢。我同意我做错了。但是,我仍然不知道如何“正确”地做到这一点。我的 python 代码传递了一个字符串列表,其中一些可能包含单引号。这就是为什么我一直用双引号括起来。那么,这样做的“正确”方法是什么?我生成 WHERE/IN 子句的代码是:``` sqlClause = "WHERE foo IN" + '("' + '","'.join(myList) + '")' ``` 结果:``` WHERE foo IN ("hello'world", "goodbye", ... etc. etc.) ``` 将所有字符串都用双引号括起来,但不适用于嵌入双引号的字符串。

标签: postgresql sqlite where-clause


【解决方案1】:

在 SQL 中,字符串由单引号分隔(例如 'foo'),而双引号通常分隔对象名称(但取决于 RBDMS 实现)。更多信息在这里https://stackoverflow.com/a/1992331/1812262

有关 SQLite 特定的详细信息,您可以在 official documentation 上找到有关您的问题的相关信息:

如果您想使用关键字作为名称,您需要引用它。 SQLite中有四种引用关键字的方式:

  • 'keyword' 单引号中的关键字是字符串文字。
  • "keyword" 双引号中的关键字是标识符。
  • [keyword] 方括号中的关键字是标识符。 > 这不是标准 SQL。此引用机制由 MS Access 和 SQL Server 使用,并包含在 SQLite 中以实现兼容性。
  • `keyword` 包含在重音符号(ASCII 代码 96)中的关键字是标识符。这不是标准 SQL。这种引用机制由 MySQL 使用,并包含在 SQLite 中以实现兼容性。

【讨论】:

    【解决方案2】:
    SELECT mt.* FROM myTable as mt
    WHERE PM  IN ('ABC');
    

    如果您有一个列pm,则查询列名称pm 中包含字符串ABC 的行。上面的代码很适合它

    https://www.sqlitetutorial.net/sqlite-select/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多