2017-07-30 5 views
2

私のアプリケーションでは、ユーザーは一致することができますが、一致が終了してから一定間隔で複数の一致が得られないようにします。NOT INとNULLを使用したクエリの処理

私は、マッチとunixタイムスタンプを付けて(zadd)保存します。ただサブクエリだ

SELECT user_id FROM users WHERE user_id NOT IN %s 

、そこにどこで多くの他の多くの条件がありますが、Redisのは空のリストを返すときに問題がある:私のPostgresのクエリで

私が行うことができるようにしたいと思いますので、その間にユーザーがアクティブでないため、IN()はエラーを返しません。

これを処理するにはどうすればよいですか?ケースといつ使用しますか?また、私は、デフォルトでは、リストのRedisの戻りで偽の負のuser_idを置くことを考えていたが、私はそのようにずっとこれは

編集ハックしません: 私のクエリのサンプルを示します。

UPDATE users SET status = %s WHERE user_id IN (SELECT user_id FROM users WHERE user_id NOT IN % LIMIT 1) 

クエリは正常に機能しましたが、今日はサブクエリの中に部分user_id NOT in %sを追加しました。私はredisが返すタプルを渡します(または、より良いredisがリストを返し、それをタプルで変換します)。それは[1234、3456、678]のような整数だけを含んでいます。タプルが(内部の少なくとも1つの元素)空でないときには正常に動作しますが、タプルが空の場合、私はこのエラーを取得:

psycopg2.ProgrammingError: ERROR: syntax error at or near ")" 
LINE 1: ...ocked = 0 AND bot_lang = 'en' AND user_id NOT IN() ORDER BY... 

いるので確かに私は、デフォルトでは、タプル内の偽のuser_idをこの追加を解決しました空ではありませんが、私はこのハッキングが気に入らず、もっと素敵な解決策を見つけたいと思います。

+3

質問を編集し、サンプルデータと希望する結果を提供して、エラーの内容を示します。あなたは '%s'として何を渡していますか?エラーは何ですか? 'NULL'sはどこに関係していますか? –

答えて

2

代わりのuser_id NOT IN (%s)あなたは非空のリストのために、そうuser_id <> ALL(ARRAY[%s]::int[])またはNOT user_id = ANY(ARRAY[%s]::int[])(私はパラメータ値からparenthesizesを除外することをお勧めしていることに注意してください)

を使用することができます。

select 1 <> all(array[1,2]::int[]); 

と空のリストについては、

select 1 <> all(array[]::int[]); 

はどちらも問題なく動作します。

psycopg2の場合:より良い方法は、パラメータの形式を解決することです。配列については、

+0

これはまさに私が求めていたものです。ありがとうございます – 91DarioDev

+0

@ user8372336ところで、あなたがタグリストに 'psycopg2'を指定していないので、私は質問本体でそれを逃しました。アップデートを参照してください。 – Abelisto

0

SIMPLのTSQLクエリのように書かれることができる:例えば

 
select * from table_name where coulmnName NOT IN ('value1','value2','value3') 

ユーザはユーザ名がColumnNameのある、TABLE_NAMEであり、そして 'ランジート' と 'JHA' は、2つの提供された値
 
select username from user where user NOT IN ('ranjeet', 'jha') 

+0

問題は、リストが動的であり、時には空になることがあることです。それが空のときに私はそのエラーを受け取ります – 91DarioDev

0

ここで例外処理を試すことができます。このような何か -

select coalesce(username,0) from user where user NOT IN ('ranjeet', 'jha') 
or user IS NULL; 
関連する問題