数据库列中的换行符和空格
我找不到使用 WHERE 条件的记录:
SELECT sensor FROM table WHERE type = 'FEET'
表里有一些记录,它们的 'type' 列的值是 'FEET',所以我觉得可能是格式出了问题。结果可能是比 'FEET' 多了一些东西,这样就找不到那些等于 'FEET' 的记录了。
为了查看 'type' 列里的记录长什么样,我用了以下代码来打印出来:
queryTem='SELECT type FROM tide_data'
curs.execute(queryTem)
resultsTem=curs.fetchall()
for resultTem in resultsTem:
print resultTem
print resultTem[0]
结果 resultTem 看起来像这样:
('FEET\n ',)
而 resultTem[0] 的结果是:FEET,实际上应该是 'FEET\n'。根据以上信息,我有没有办法重写 WHERE 条件语句,找到正确的记录?因为在语句中:WHERE a = value.. a 应该是列名,我想不出有什么办法可以做到。
有人能帮我一下吗?谢谢..
4 个回答
试着用一个带有“like”关键字的查询。这种方法虽然不是最优的,但可以达到目的。
查询的写法是:SELECT sensor FROM table WHERE type LIKE ‘%FEET%’
resultTem[0] 不是 "FEET",而是 "FEET\n"。如果你想让你的查询正常工作,就需要清理一下你的数据。
你说“在这个语句中:WHERE a = value.. a 应该是一个列名”。其实不然,a
可以是任何表达式。
你说“resultTem 的结果像这样:('FEET\n ',),而 resultTem[0] 的结果像这样:FEET,应该是 'FEET\n'”。与其用 print resultTem[0]
,不如用 print repr(resultTem[0])
。在调试的时候,养成使用 repr()
的习惯。
正如其他人指出的,你的数据需要清理。如果 type
列上有索引,后面多余的空格会影响索引。如果你的数据库有一个函数(比如叫 STRIP),它的功能类似于 Python 的 str.strip()
,你可以用一行代码来解决这个问题,像这样:
UPDATE table SET type = STRIP(type) WHERE type != STRIP(type);
同时,你可以做一个“以...开头”的查询:
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
。可以查看 文档的这一部分,注意页面中间的“提示”。
(2) 似乎没有像 str.strip()
那样简单的 SQL 函数来去掉前后的空格。在 PostgreSQL 中,你需要用类似于
TRIM(E' \r\n\t' FROM your_string_expression)
的方式来去掉前后的空格、回车、换行和制表符。可以查看文档 这里(还有 这里;阅读第 4.1.2.2 节,关于带 C 风格转义的字符串常量)。