質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1673閲覧

pythonでsqliteを使い、where区で特定のカラムの先頭5文字を限定してデータ取得

dendenmushi

総合スコア98

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2021/04/04 04:33

前提・実現したいこと

pythonでsqliteを使い、where区で特定のカラムの先頭5文字を限定してデータ取得したい。

発生している問題・エラーメッセージ

sqlite3.OperationalError: no such function: SUBSTRING

該当のソースコード

python

1import sqlite3 2 3def filepath_to_db(filepath): 4 5 conn = sqlite3.connect(filepath) 6 7 # 全データを抽出する 8 cur = conn.cursor() 9 10 cur.execute( 11 "SELECT item_id, store_name, item_name FROM items s WHERE SUBSTRING(s.item_name, 1, 6) like 'パンナコッタ'") 12 13 items_list = cur.fetchall() 14 15 # items_list's address into address_db 16 address_db_pre = [] 17 address_db = [] 18 19 for n in range(int(len(items_list))): 20 address_db_pre = [] 21 address_db_pre.append(items_list[n][1]) 22 address_db_pre.append(items_list[n][3]) 23 address_db.append(address_db_pre) 24 return address_db 25 26tokyo_okasi_list = filepath_to_db("tokyo_okasi.sqlite")

試したこと①

python

1 cur.execute( 2 "SELECT item_id, store_name, item_name FROM items s WHERE LEFT(s.item_name, 6) like 'パンナコッタ'")
sqlite3.OperationalError: near "(": syntax error

試したこと②

python

1 cur.execute( 2 "'SELECT item_id, store_name, item_name FROM items s WHERE LEFT' + '(' + 's.item_name, 6' + ')' + 'like "パンナコッタ"' ")
sqlite3.OperationalError: near "(": syntax error

はまってしまいましてかなり苦戦しております。どなたかアドバイス頂けないでしょうか。
宜しくお願い致します。

補足情報(FW/ツールのバージョンなど)

win10
python3.7

teamikl👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sqlite3.OperationalError: no such function: SUBSTRING

Pythonのバージョン、もしくは組み込みのsqlite3のバージョンを確認して見て下さい。
コード自体は新しいバージョンでは動くはずです。

  • 文字列連結でクエリーを生成するのはお勧めしません。

 エスケープが必要になるので、安全の為にはプレースホルダー(placeholder) を使います。

  • SQL の LIKE 句の使い方。パターンマッチの文字が含まれていません。

旧バージョンに対応する解決策:

  • LIKE句のパターンマッチを使う。
    WHERE s.item_name LIKE 'パンナコッタ%'
  • 追記: SUBSTR を使う
    "substring()" is an alias for "substr()" beginning with SQLite version 3.34.

python3.7/sqlite 3.21 substring は失敗。substr は使えました。
python3.8/sqlite 3.34 でsubstring の動作を確認。
※ パッチバージョンによってもバージョンが変わるかもしれません。

python

1# sqliteのバージョンの確認方法 2import sqlite3 3print(sqlite3.sqlite_version_info)

投稿2021/04/04 06:07

編集2021/04/04 06:23
teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dendenmushi

2021/04/04 13:10

python3.7 sqlite3.3.1でした。substrがコード記載時に黄色に反転(Visual Studio Codeのpython関連ライブラリ)せずにSUBSTRINGだけ反転していたので利用できないかと思っていましたが、おっしゃるとおり試しましたらsubstrでできました。即解決できました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問