You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python传入None检测PostgreSQL含Null行失败,如何解决?

解决PostgreSQL中Null值匹配的检测问题

问题根源

Python的None确实对应PostgreSQL的Null,但SQL的逻辑规则和Python不同:在SQL中,Null不等于任何值,包括它自己。你原来的函数里用TEGENREKENING=_tegenrekening,当传入的_tegenrekening是Null时,这个条件会返回Null(被视为False),导致EXISTS子句判定无匹配行,最终返回False。

方案1:修改PostgreSQL函数

直接调整函数里的条件判断,处理Null的匹配场景,有两种写法:

写法1:显式判断Null

CREATE OR REPLACE FUNCTION public.control2(_datum date, 
_tegenrekening character varying)
 RETURNS TABLE(bestaat boolean)
 LANGUAGE sql
AS $function$
BEGIN
    RETURN QUERY
    SELECT EXISTS (
        SELECT 1 FROM "rekening" 
        WHERE "DATUM" = _datum
        AND ("TEGENREKENING" = _tegenrekening OR ("TEGENREKENING" IS NULL AND _tegenrekening IS NULL))
    ) as bestaat
    LIMIT 1;
END
$function$

写法2:使用IS NOT DISTINCT FROM(更简洁)

PostgreSQL提供的IS NOT DISTINCT FROM操作符会将Null视为相等,直接替代=即可:

CREATE OR REPLACE FUNCTION public.control2(_datum date, 
_tegenrekening character varying)
 RETURNS TABLE(bestaat boolean)
 LANGUAGE sql
AS $function$
BEGIN
    RETURN QUERY
    SELECT EXISTS (
        SELECT 1 FROM "rekening" 
        WHERE "DATUM" = _datum
        AND "TEGENREKENING" IS NOT DISTINCT FROM _tegenrekening
    ) as bestaat
    LIMIT 1;
END
$function$

方案2:在Python代码中动态处理条件

如果不想修改数据库函数,可以在Python端根据参数是否为None,生成对应的查询语句(以psycopg2为例):

import psycopg2

def check_row_exists(datum, tegenrekening):
    # 替换为你的数据库连接参数
    conn = psycopg2.connect(dbname="your_db", user="your_user", password="your_pwd", host="your_host")
    cur = conn.cursor()

    if tegenrekening is None:
        query = """
            SELECT EXISTS (
                SELECT 1 FROM "rekening" 
                WHERE "DATUM" = %s AND "TEGENREKENING" IS NULL
            )
        """
        cur.execute(query, (datum,))
    else:
        query = """
            SELECT EXISTS (
                SELECT 1 FROM "rekening" 
                WHERE "DATUM" = %s AND "TEGENREKENING" = %s
            )
        """
        cur.execute(query, (datum, tegenrekening))

    exists = cur.fetchone()[0]
    cur.close()
    conn.close()
    return exists

内容的提问来源于stack exchange,提问作者HzM74

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:55:20