我正在尝试使用查询来标记我的表字段。
SELECT regexp_split_to_table(mytable.field_name, E'\\s+') from mytable limit 20;
当我从psql shell执行它时,这可以工作:
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 :(得分:3)
反斜杠被Django视为元字符,并在双引号内解释。
因此,在字符串到达PostgreSQL服务器之前,会剥离一层E'\\s+')
,这将看到E'\s+')
。转义字符串将生成's+'
,这反过来会使regexp_split_to_table()
将字符串拆分为任意数量的s
,而不是非打印空间,字符类缩写为\s
代表正则表达式。
将字符串中的反斜杠加倍,以达到预期效果:E'\\\\s+')
:
"SELECT regexp_split_to_table(field_name, E'\\\\s+') FROM mytable LIMIT 20"
作为替代方案,为避免出现反斜杠\
的特殊含义问题,您可以使用[[:space:]]
来表示相同的字符类:
"SELECT regexp_split_to_table(field_name, '[[:space:]]+') FROM mytable LIMIT 20"
"Pattern Matching" in the manual一章中的详细信息。
答案 1 :(得分:2)
感谢Django F
,Func
中的新内容以及postgresql ArrayField
的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])