Sqlite选择字符串相等,其中value与列名相同?

时间:2017-04-15 23:07:29

标签: string sqlite name-collision

我有一个Sqlite3(v3.8.7.1 2014-10-29)数据库,其中包含一个包含本地安装软件包名称的表,包括版本,安装日期,软件主页URL等详细信息。

现在出现了一个问题,其中一个软件包(CPAN模块"版本")恰好与其中一个表列相同,即"版本"。

在一个表的最简单的测试用例中"包"

   name     |   version
  ----------+-----------
   delete   |   2.2.5
   replace  |   1.2.5
   search   |   3.1
   version  |   0.2.3

  echo 'SELECT * FROM Packages where name = "replace" ;' | sqlite3 Test.db
  replace|1.2.5

  echo 'SELECT * FROM Packages WHERE name = "search" ;' | sqlite3 Test.db
  search|3.1

但是在尝试检索名为"版本"

的包的条目时
  echo 'SELECT * FROM Packages WHERE name = "version" ;' | sqlite3 Test.db

没有返回任何内容,因为可能是因为它试图将名称与"版本"中的值进行比较。列。

有没有办法强制进行文字字符串比较,或者是避免此类问题的唯一解决方案是从"版本"重命名列。其他东西,例如" package_version",希望永远不会与可能的包名字符串冲突?

1 个答案:

答案 0 :(得分:2)

重复

sqlite SELECT returns all records when querying a column for a value with the same name as the column

我在搜索可能的答案时错过了。

Sky Sanders的解决方案是在字符串值周围使用单引号。

echo "SELECT * FROM Packages WHERE name = 'version' ;" | sqlite3 Test.db

显式单引号可以防止shell变量的扩展,因此可以通过使用扩展为单引号的shell变量来克服该问题,即

name="version"
quote="'"
table="Packages"

echo "SELECT * FROM ${table} WHERE name = ${quote}${name}${quote} ;" | sqlite3 Test.db