【问题标题】:pyscopg2 select NULL valuespsycopg2 选择 NULL 值
【发布时间】:2014-02-10 02:04:27
【问题描述】:

如何在 Psycopg2 中使用 string substitution 来处理 NULL 和非 NULL 值?

例如:

sql = 'SELECT * FROM table WHERE col = %s;'
possible_params = [1, None]

for x in possible_params:
    print cur.mogrify(sql,(x,))

我需要第一个查询看起来像 SELECT * FROM table WHERE col = 1; 而第二个查询是 SELECT * FROM table WHERE col IS NULL; 的功能等价物

有什么诀窍吗?我有很多列可能为 NULL 或有值,因此动态构建 SQL 相当麻烦。

【问题讨论】:

    标签: python postgresql postgresql-9.2 psycopg2


    【解决方案1】:

    每次您不知道参数是否为NULL 时,您可以使用以下模式:

    SELECT * FROM table WHERE col = <parameter> OR (col IS NULL AND <parameter> IS NULL)
    

    &lt;parameter&gt; 是您的参数。

    但请注意,我连续两次使用相同的参数,因此您需要切换到dict 格式。完整代码为:

    sql = 'SELECT * FROM table WHERE col = %(p)s OR (col IS NULL AND %(p)s IS NULL)'
    possible_params = [{"p":1}, {"p":None}]
    
    for x in possible_params:
        print cur.mogrify(sql,(x,))
    

    【讨论】:

      【解决方案2】:

      我想尽了办法:

      SELECT COUNT(*) FROM table WHERE col = Null;
      SELECT COUNT(*) FROM table WHERE col::TEXT = '';
      SELECT COUNT(*) FROM table WHERE col IN (Null::TEXT);
      SELECT COUNT(*) FROM table WHERE col IN (VALUES (NULL::TEXT));
      

      然后只是捣碎 kludgy if 语句,例如:

      if record['api'] is not None:
          sql += 'api = %(api)s'
      else:
          sql += 'api IS NULL'
      

      【讨论】:

        猜你喜欢
        • 2018-07-18
        • 1970-01-01
        • 2011-08-01
        • 2023-03-27
        • 2011-04-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        相关资源
        最近更新 更多