2013-02-21 133 views
0

我得到一个令人困惑的选择......在那里结果,该表的定义是:SELECT * ... WHERE列= “字符串” 返回无效的行

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 | 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(名称和SHORT_NAME)应该不匹配,它们是6和匹配的术语是 “模式”。如果我将匹配字符串“Mode”更改为任何其他字符串,则按预期工作。 “模式”是保留字吗?或者我以某种方式将变量“模式”设置为6 ?.我不明白这种行为。

回答

2

如果使用[“]这意味着列,所以当你做

name="Mode" 

这意味着你在具有相同的值列模式列名称进行搜索。所以,你选择其中mode = 6和名称= 6实际上是在你的代码。 如果你想使用字符串,可以使用[']不是[“]

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

select * from products 
where name="Mode" 

而且我得到了错误

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

如果你想给一个条件字符串只是尝试使用LIKE或其他,而不是[=]。 – ksugiarto 2013-02-21 03:38:45

+0

谢谢,这种改变使其表现如预期。 我在文档中找到了单引号,我仍然在寻找双引号。 我试图给你投票,但我没有足够的声誉呢。 – Bill 2013-02-21 03:58:52

0

我的熟悉程度不是与sqlite3,但我会说,它看起来像我正在做name =“模式”,这是采取modes.mode对象,并检查它。如果你做SELECT * FROM modes where name="Mode" order by channel。你可能会发现它也只是给你3|6|1|6|6|0|255|a|b