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

0 投票
2 回答
2272 浏览
提问于 2025-04-16 13:31

现在我有一个表格table1,它里面有最小值和最大值,这些值定义了一个范围。还有一个表格table2,里面有一个布尔类型的列,这个列的值是根据table1的最小值和最大值来决定的。如果实际的数字在这个范围内,值就会是F(表示没有问题),反之则不是。运行我的代码后,只有前两行的这个列显示为false。我不知道我的代码哪里出了问题。下面是我的for循环代码块。在这里,records1是table2中的实际值,records2和records3分别是table1中的最小值和最大值。我使用这个for循环语句来获取这三组数字中的单个记录,然后在其中的if语句里,我通过检查record1是否在min(record2)和max(record3)的范围内来确定布尔列的每个值。

    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 个回答

2

注意一下Python中range的用法...

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

你可能更应该这样写你的比较语句:

if record2 <= record1 <= record3:

而且从你的代码来看,你似乎是在用你的语句更新整个表,而不是只更新你比较的那几行记录。

我觉得你在for循环中有点多余,实际上用一条SQL语句就可以完成你想要的操作,或者你需要传入行的ID,然后在WHERE子句中使用它。

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)'

...

我没有在循环中使用变量,而是用了一个选择语句。在这个选择语句里,我使用了一个WHERE条件来定义最小值和最大值对应的记录。这样做似乎更好。

撰写回答