数据库列中的换行符和空格

时间:2011-03-24 18:26:30

标签: python postgresql whitespace where-clause

我无法使用WHERE CLAUSE找到记录:

SELECT sensor FROM table WHERE type = 'FEET'

表中有'type'列值为'FEET'的记录,所以我认为格式有问题。结果将超过'FEET',因此它根本无法找到等于'FEET'的那些。

为了找出列类型中的记录,我使用以下代码将它们打印出来:

    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 CLAUSE语句并获得正确的记录?因为在语句中:WHERE a = value .. a应该是一个列名,我想不出办法做到这一点。

有人可以帮助我吗?感谢..

4 个答案:

答案 0 :(得分:2)

你说“”“因为在声明中:WHERE a = value .. a应该是列名”“”。不是这样,a可以是任何表达。

你说“”“resultTem结果如下:('FEET \ n',),而resultTem [0]结果如下:FEET,应为'FEET \ n'”“。而不是{{1使用print resultTem[0]。养成在调试情况下使用print repr(resultTem[0])的习惯。

正如其他人所指出的那样,您的数据需要清理。如果该repr()列上有索引,则尾随随机空格将干扰索引。如果你的数据库有一个像Python的type那样工作的函数(名为STRIP),你应该可以用这样的单行程修复它:

str.strip()

与此同时,您可以执行“STARTwith”类型的查询:

UPDATE table SET type = STRIP(type) WHERE type != STRIP(type);

或使用

SELECT sensor FROM table WHERE type LIKE 'FEET%'

进一步评论:

(1)看起来你的输出字符串是30个字符宽(除非它被你的粘贴和我的编辑所破坏:

SELECT sensor FROM table WHERE STRIP(type) = 'FEET'

额外空格的一种可能解释是列数据类型为('FEET\n ',) .... v....1....v....2....v....3 。如果这在您的控制之下,您可能希望将其更改为CHAR(30)VARCHAR(30)。请参阅this section of the docs并注意页面中间的“提示”。

(2)似乎没有像VARCHAR那样简单的SQL函数来删除前导/尾随空格。在PostgreSQL中,你需要像

这样的东西
str.strip()

删除前导和尾随空格,回车符,换行符和制表符。请参阅文档here(和here;阅读第4.1.2.2节。带有C风格转义的字符串常量。)

答案 1 :(得分:1)

resultTem [0]不是“FEET”,它是“FEET \ n”。如果您希望查询起作用,则需要清理数据。

答案 2 :(得分:1)

尝试使用类似的关键字查询。不是最佳但会起作用。

SELECT sensor FROM table WHERE type LIKE'%FEET%'

答案 3 :(得分:0)

看起来当您插入表格时,您没有删除结束语(\ n)

>>> a = ["FEET\n",]
>>> print a
['FEET\n']
>>> print a[0]
FEET

>>> 

注意脚后的额外线条。

如果\ n始终附加到该列中的英尺,则可以select sensor from table where type="FEET\n"