2012-01-18 2 views
3

私はテーブルフィールドをクエリでトークン化しようとしています。PostgreSQL。 regexp_split_to_table not working

SELECT regexp_split_to_table(mytable.field_name, E'\\s+') from mytable limit 20; 

私はpsqlのシェルからそれを実行したときに、私が行うとき、これは動作します:

from django.db import connection cursor=connection.cursor() 
cursor.execute("SELECT regexp_split_to_table(mytable.field_name,E'\\s+') 
       FROM mytable LIMIT 20") 
cursor.fetchall() 

...それはトークンを返すことができません。私は間違って何をしていますか?

+0

それはpsycopg doent思わPostgresの機能を実行します。 – mossplix

+0

Djangoについてよく分かりませんが、ここには考えがあります: "SELECT * FROM(SELECT regexp_split_to_table(fld、E '\\ s +')FROM tbl LIMIT 20)x LIMIT 20"。 Djangoが関数が一連の値を返すことができると理解していない場合 –

+0

も動作しません。 (SOPA、ブラックアウト)]を返します[ – mossplix

答えて

3

バックスラッシュはDjangoによってメタキャラクタとして扱われ、二重引用符で囲まれて解釈されます。 したがって、文字列がPostgreSQLサーバに到着する前にE'\\s+')の1つのレイヤーが削除されます。これはE'\s+')と表示されます。エスケープ文字列は's+'となり、regexp_split_to_table()は文字列をの任意の数に分割します。文字列は、正規表現では文字クラス\sの略です。

あなたが意図したものを取得するには、文字列でダ​​ブルあなたのバックスラッシュ:E'\\\\s+')

"SELECT regexp_split_to_table(field_name, E'\\\\s+') FROM mytable LIMIT 20" 

代替として、バックスラッシュ\の特別な意味を持つの問題を回避するために、あなたは同じ文字を表すために[[:space:]]を使用することができますクラス:章"Pattern Matching" in the manual

"SELECT regexp_split_to_table(field_name, '[[:space:]]+') FROM mytable LIMIT 20" 

詳細。

1

ジャンゴFFuncの新しいのおかげで、あなたは今、このように、この関数を呼び出すことができますArrayField PostgreSQLのsupprot:

from django.db.models import F, Value, TextField 
from django.contrib.postgres.fields import ArrayField 
from django.db.models.expressions import Func 

MyTable.objects.annotate(
    some_field_splitted=Func(
     F('some_field'), 
     Value(","), 
     function='regexp_split_to_array', 
     output_field=ArrayField(TextField()) 
    ) 
).filter(some_field_splitted__contains=[HERE_SOME_VALUE])