SELECT * ... WHERE col =“string”返回无效行

时间:2013-02-21 03:18:00

标签: sqlite

我得到一个令人困惑的选择...结果,表定义是:

CREATE TABLE modes (
               key INTEGER,
               mode INTEGER,
               channel INTEGER,
               name TEXT,
               short_name TEXT,
               def INTEGER,
               highlight INTEGER,
               catagory TEXT,
               subcatagory TEXT);

它填充了:

sqlite> select * from modes;
  3|6|5|Green|G|0|255|a|b
  3|6|6|Blue|B|0|255|a|b
  3|9|1|Mode|Mode|0|255|a|b
  3|9|2|Auto Mode Speed|Speed|0|255|a|b
  3|9|3|Strobe|Strobe|0|255|a|b
  3|9|4|Red|R|0|255|a|b
  3|9|5|Green|G|0|255|a|b
  3|9|6|Blue|B|0|255|a|b
  3|9|7|Red2|R2|0|255|a|b
  3|9|8|Green2|G2|0|255|a|b
  3|9|9|Blue2|B2|0|255|a|b
  3|6|4|Red|R|0|255|a|b
  3|6|1|6|6|0|255|a|b
  3|6|2|Auto mode speed|speed|0|255|a|b
  3|6|3|Strobe|Strobe|0|255|strobe|b

请注意底部的第3行:     第3 | 6 | 1 | 6 | 6 | 0 | 255 | A | B

如果我选择:     SELECT * FROM modes where mode=6 and name="Mode" order by channel;

它返回:     3|6|1|6|6|0|255|a|b

第4列和第5列(name和short_name)不匹配,它们是6,匹配项是" Mode"。如果我更改匹配字符串"模式"到任何其他字符串它按预期工作。是" Mode"保留字?或者我是否以某种方式设置变量" Mode"到6?我不明白这种行为。

3 个答案:

答案 0 :(得分:2)

如果您使用[“],则表示列,所以当您执行

name="Mode"

这意味着您在列名称中搜索与列模式具有相同值的值。因此,您可以在代码中选择mode = 6和name = 6的位置。 如果要使用字符串,请使用[']而不是[“]

我尝试在我的数据库中使用该代码..

select * from products
where name="Mode"

我收到了错误

ERROR:  column "Mode" does not exist
LINE 2: where name="Mode"

答案 1 :(得分:1)

如果有其他人在寻找,我终于在文档中找到了它。 它位于the sqlite3 FAQ

答案 2 :(得分:0)

我的熟悉程度不是sqlite3,但我会说它看起来像你在做名字=“模式”,它正在接受modes.mode对象并检查它。

如果你SELECT * FROM modes where name="Mode" order by channel。你可能会发现它只是给你3|6|1|6|6|0|255|a|b