複数の値を持つパラメーターに基づいてSQLクエリをフィルタリングする

ケビン・ナッシュ

2つのパラメーター(2列)でフィルター処理する必要があるSQLを作成しようとしていますが、2番目の列は複数の値と一致する必要があります。

以下に私がこれまでに構築したSQLを示します(Martijn Pietersの助けに感謝します

import psycopg2
import pandas as pd
import datetime

# Connecting to db

con = psycopg2.connect(db_details)
cur = con.cursor()
cur.execute("select * from sales limit 10")
rows = cur.fetchall()

params = {'earliest': datetime.datetime.today() - datetime.timedelta(days=7),
      'store_name': 'store_1', 'store_2'}

df = pd.read_sql("""
     select store_name,count(*) from sales 
     where created_at >= %(earliest)s
     and store_name = %(store_name)s""",
 params=params, con=con)

上記のSQLには、where句で使用される日付パラメータが1つあり、さらに1つのパラメータ、つまりstore_nameを追加しました。ここで、行は2つの値のいずれかに一致します。

この追加パラメータを既存のクエリに追加する方法を知りたいです。

パラメータ(日付フィルタと同様)を作成して既存のクエリに渡そうとしましたが、2つの値を指定すると構文エラーが発生します。

    'store_name': 'store_1', 'store_2'}
                                      ^
SyntaxError: invalid syntax

paramsフィールドを指しています。

Martijn Pieters

2つの問題があります。

  • 無効なPython構文を使用しました。辞書のコンマはキーと値のペアを区切るため、'store_2'文字列は別のキーと値のペアになりますが、: value部分が欠落しています。複数の文字列で値を定義する場合は、タプルまたはリストを使用する必要があります。明示的に使用するか(...)[...]その構文をkey: value, key: value表記から分離します

    params = {
        'earliest': datetime.datetime.today() - datetime.timedelta(days=7),
        'store_name': ('store_1', 'store_2'),  # tuple with two values
    }
    
  • 一般的に、SQLパラメータは単一の値でのみ機能しますstore_nameパラメータは、単一の値ではなく、値のシーケンスを与えることができます。これは、SQLパラメーターがSQLクエリとそのクエリで使用される動的値の間のブリッジであり、パラメーターが個々の動的値のプレースホルダーとして機能するように設計されているためです。

    とは言うものの、psycopg2ライブラリは特にタプルをサポートしていますが、これはほとんどのPythonデータベースライブラリの例外です。

    次に、'store_1'またはのいずれかに一致する行をフィルタリングする場合'store_2'、正しいSQL構文は、と括弧で囲まれた2つのstore_name = ...テストを使用するかORストア名テストにdate接続されたテストからその部分を分離するためAND)、またはを使用することです。store_name IN ('store_1', 'store_2')INテストは、に記載されている複数の値に対して、列名を比較(...)括弧。

psycopg2ここで使用している場合store_name、タプル値を参照するキーを使用することINはできますが、クエリには次のように使用する必要があります。

params = {
    'earliest': datetime.datetime.today() - datetime.timedelta(days=7),
    'store_name': ('store_1', 'store_2')
}

df = pd.read_sql("""
     SELECT store_name, count(*) FROM sales 
     WHERE created_at >= %(earliest)s
     AND store_name IN %(store_name)s""",
     params=params, con=con)

別の注記:pd.read_sql()関数[DBAPI接続を使用する場合はsqliteのみがサポートされることを明示的に示しています](DBAPI2オブジェクトの場合、sqlite3のみがサポートされます):

DBAPI2オブジェクトの場合、sqlite3のみがサポートされます。

あなたはそのようなオブジェクトを使用しています。ほとんどのPythonデータベースアダプタはDBAPI2ライブラリです。DBAPI2は、そのようなライブラリのPython標準です

代わりにSQLAlchemy接続文字列を実際に使用する必要がありますデータベースにデータを書き戻そうとしないため、コードは機能します。psycopg接続とカーソルオブジェクトはsqlite3ライブラリのバージョンとほぼ互換性がありますが、将来的に問題が発生する可能性があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

パラメータの動的な数に基づいてクエリをフィルタリングする方法

分類Dev

URLクエリ文字列パラメーターに基づいてilightboxポートフォリオアイテムをフィルタリングする

分類Dev

jersey / jackson-クエリパラメータに基づいてプロパティをフィルタリングする

分類Dev

別のテーブルに基づいて無効なフィールド値を持つデータをフィルタリングする

分類Dev

フィルタ値を持つオブジェクトに基づいてデータをフィルタリングする

分類Dev

データ属性を使用して、複数のIDを持つ配列に基づいてDOMノードをフィルタリングします

分類Dev

パワークエリで別のテーブルの値に基づいてテーブルの行をフィルタリングする方法

分類Dev

複数の列のNAに基づいてデータフレームをフィルタリングする

分類Dev

別のリストの1つのプロパティのすべての値に基づいてlinqクエリをフィルタリングする方法

分類Dev

複数のクラスデータに基づいてデータをフィルタリングする必要がある

分類Dev

複数のキー/値のペアの存在に基づいて出力をフィルタリングします

分類Dev

特定のプロパティと値に基づいてJSONデータをフィルタリングする

分類Dev

グループに基づいて複数のオカレンスをフィルタリングする

分類Dev

複数の条件に基づいてグループ内の行をフィルタリングする

分類Dev

同じ基準に基づいて複数のシートをフィルタリングするvba

分類Dev

キーの値に基づいてRDDをフィルタリングする

分類Dev

Python-複数のキーに基づいて辞書のリストをフィルタリングする

分類Dev

LINQを使用した複数のパラメーターに基づくフィルタリング?

分類Dev

残り火2.8の入力フィールド値に基づいてクエリパラメータ値を設定する

分類Dev

挿入の降順の日付とともに特定の列の値に基づいてレコードをフィルタリングするSQLクエリ

分類Dev

パンダの時間値に基づいてデータをフィルタリングする方法は?

分類Dev

同じURLパラメータを維持しながら、サブドメインに基づいてエリアにルーティングする

分類Dev

2つの列に基づいてSQLテーブルの複数の行をフィルタリングする方法

分類Dev

条件に基づいてパンダシリーズの値をフィルタリングする方法

分類Dev

Laravel-パラメータに基づいてhasMany関係をフィルタリングする方法は?

分類Dev

URLパラメータに基づいて「繰り返し」をフィルタリングする

分類Dev

変数のグループの値に基づいてdata.tableをフィルタリングする

分類Dev

複数の異なるグループの複数の異なる値に基づいてdfをフィルタリングします

分類Dev

型パラメーターのtype引数に基づいてポリモーフィックな戻り値の型を持つ関数を作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    パラメータの動的な数に基づいてクエリをフィルタリングする方法

  2. 2

    URLクエリ文字列パラメーターに基づいてilightboxポートフォリオアイテムをフィルタリングする

  3. 3

    jersey / jackson-クエリパラメータに基づいてプロパティをフィルタリングする

  4. 4

    別のテーブルに基づいて無効なフィールド値を持つデータをフィルタリングする

  5. 5

    フィルタ値を持つオブジェクトに基づいてデータをフィルタリングする

  6. 6

    データ属性を使用して、複数のIDを持つ配列に基づいてDOMノードをフィルタリングします

  7. 7

    パワークエリで別のテーブルの値に基づいてテーブルの行をフィルタリングする方法

  8. 8

    複数の列のNAに基づいてデータフレームをフィルタリングする

  9. 9

    別のリストの1つのプロパティのすべての値に基づいてlinqクエリをフィルタリングする方法

  10. 10

    複数のクラスデータに基づいてデータをフィルタリングする必要がある

  11. 11

    複数のキー/値のペアの存在に基づいて出力をフィルタリングします

  12. 12

    特定のプロパティと値に基づいてJSONデータをフィルタリングする

  13. 13

    グループに基づいて複数のオカレンスをフィルタリングする

  14. 14

    複数の条件に基づいてグループ内の行をフィルタリングする

  15. 15

    同じ基準に基づいて複数のシートをフィルタリングするvba

  16. 16

    キーの値に基づいてRDDをフィルタリングする

  17. 17

    Python-複数のキーに基づいて辞書のリストをフィルタリングする

  18. 18

    LINQを使用した複数のパラメーターに基づくフィルタリング?

  19. 19

    残り火2.8の入力フィールド値に基づいてクエリパラメータ値を設定する

  20. 20

    挿入の降順の日付とともに特定の列の値に基づいてレコードをフィルタリングするSQLクエリ

  21. 21

    パンダの時間値に基づいてデータをフィルタリングする方法は?

  22. 22

    同じURLパラメータを維持しながら、サブドメインに基づいてエリアにルーティングする

  23. 23

    2つの列に基づいてSQLテーブルの複数の行をフィルタリングする方法

  24. 24

    条件に基づいてパンダシリーズの値をフィルタリングする方法

  25. 25

    Laravel-パラメータに基づいてhasMany関係をフィルタリングする方法は?

  26. 26

    URLパラメータに基づいて「繰り返し」をフィルタリングする

  27. 27

    変数のグループの値に基づいてdata.tableをフィルタリングする

  28. 28

    複数の異なるグループの複数の異なる値に基づいてdfをフィルタリングします

  29. 29

    型パラメーターのtype引数に基づいてポリモーフィックな戻り値の型を持つ関数を作成するにはどうすればよいですか?

ホットタグ

アーカイブ