我找不到使用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样式转义符的字符串常量)。

09-05 16:01