我找不到使用WHERE子句的记录:
SELECT sensor FROM table WHERE type = 'FEET'
表中的“type”列值为“FEET”的记录,因此我认为格式有问题。其结果将是超过“英尺”的东西,因此它根本找不到那些等于“英尺”的东西。
为了找出column type中的记录是什么样的,我使用了以下代码来打印它们:
queryTem='SELECT type FROM tide_data'
curs.execute(queryTem)
resultsTem=curs.fetchall()
for resultTem in resultsTem:
print resultTem
print resultTem[0]
结果如下:
('FEET\n ',)
而resultTem[0]的结果是:FEET,应该是'FEET\n'。根据上面的信息,是否有任何方法可以重写WHERE子句语句并获得正确的记录?因为在语句中:其中a=值。。a应该是一个列名,我想不出办法。
有人能帮我吗?谢谢。。
最佳答案
你在语句中说“”:其中a=值。。a应该是列名“”。不是这样,a
可以是任何表达式。
你说“resultTem”的结果类似于:('FEET\n',),而resultTem[0]的结果类似于:FEET,应该是'FEET\n'”。使用print resultTem[0]
,而不是print repr(resultTem[0])
。养成在调试情况下使用repr()
的习惯。
正如其他人指出的,您的数据需要清理。如果在type
列上有索引,尾随随机空白将干扰索引。如果您的数据库有一个类似于Python的str.strip()
的函数(名为STRIP),那么您应该能够用一行代码修复它,如下所示:
UPDATE table SET type = STRIP(type) WHERE type != STRIP(type);
同时,您可以执行“startswith”类型的查询:
SELECT sensor FROM table WHERE type LIKE 'FEET%'
或使用
SELECT sensor FROM table WHERE STRIP(type) = 'FEET'
进一步评论:
(1)您的输出字符串看起来有30个字符宽(除非它被您的粘贴和我的编辑弄坏了:
('FEET\n ',)
.... v....1....v....2....v....3
额外空格的一个可能解释是列数据类型是
CHAR(30)
。如果这是在您的控制下,您可能希望将其更改为VARCHAR(30)
或只是VARCHAR
。请参阅this section of the docs并注意页面中间的“提示”。(2)似乎没有比
str.strip()
更容易删除前导/尾随空格的SQL函数了。在PostgreSQL中,您需要TRIM(E' \r\n\t' FROM your_string_expression)
要删除前导和尾随空格、回车符、换行符和制表符。参见文档here(和here;阅读第4.1.2.2节。带有C样式转义符的字符串常量)。