根据最小值和最大值确定布尔值

时间:2011-03-11 19:14:31

标签: python database for-loop boolean

现在我有来自table1的min,max值,它定义了一个值的范围。 table2中有一个布尔列,其值由table1中的min和max值确定。如果实际数字在该范围内,则该值将为F(表示没有问题),反之亦然。在我运行我的代码后,只有列的前两行显示为false。我不知道我的代码有什么问题。我的for循环块代码如下。其中,records1是table2中的实际值,records2和records3分别是table1中的最小值和最大值。我使用这个forloop语句来获取三组数字的单个记录,然后在其中的if语句中,通过检查record1是否落在min(record2)和max(record3)之间的范围内来确定boolean列的每个值。 )价值观。

    conn = psycopg2.connect(conn_string)
    # conn.cursor will return a cursor object, you can use this cursor to perform queries

    #get the actual number
    curs1 = conn.cursor()
    statement='SELECT value FROM table2'
    curs1.execute(statement)
    records1=curs1.fetchall()

    #get the minimum number
    curs2 = conn.cursor()
    statement2='SELECT min FROM table1'
    curs2.execute(statement2)
    records2=curs2.fetchall()

    #get the maximum number
    curs3 = conn.cursor()
    statement3='SELECT max FROM table1'
    curs3.execute(statement3)
    records3=curs3.fetchall() 


    for record1 in records1:
        for record2 in records2:
            for record3 in records3:
                while record1 >= record2 and record1 <=record3::
                    statement4='UPDATE table2 SET column = false WHERE record1 >=   record2 and record1 <= record3'
                    curs4 = conn.cursor()
                    curs4.execute(statement4)

                else:
                    statement5='UPDATE table2 SET column = true WHERE record1 <= record2 or record1 >= record3'
                    curs5 = conn.cursor()
                    curs5.execute(statement5)
                conn.commit()
                conn.close()

有人可以指出我错在哪里吗?事先提前

2 个答案:

答案 0 :(得分:2)

注意范围在python中的工作方式......

>>> range(1,5)
[1, 2, 3, 4]
>>>

你可能最好做一下你的比较声明:

if record2 <= record1 <= record3:

也可以从你的语句更新整个表而不是你的比较中的记录行。

我认为你在for循环中是多余的,而sql语句应该处理你想要完成的事情,或者你需要为行传入一个id并将其用于WHERE子句。

答案 1 :(得分:0)

我使用下面的陈述解决了这个问题:

 statement1='UPDATE table2 SET column= false WHERE value >= (SELECT min FROM table1 WHERE
 table1.common_name=table2.common_name) AND value <=(SELECT max FROM table1 WHERE 
 table1.common_name=table2.common_name)'

...

而不是在forloop中使用变量,我使用了select语句,在其中我使用WHERE子句来定义min和max的记录。这似乎是一种更好的方法。