【问题标题】:how to put % in string如何将%放入字符串
【发布时间】:2016-12-16 14:23:05
【问题描述】:

我已经尝试过使用'%%''%',但在以下场景中这些都不起作用。

查询的输出是:

UPPER('field') LIKE UPPER('string')

但我希望输出为:

UPPER('field') LIKE UPPER('%string%')

【问题讨论】:

  • 你试过用反斜杠转义它们吗?
  • return 'UPPER({0}) LIKE UPPER(%{1}%)'.format(lhs,rhs)
  • 顺便说一句,你知道 '%something%' 类型的查询不会使用 sqlite 和 mysql 上的索引,而 UPPER 也将无法使用 postgresql 上的索引(当然,除非你定义了一个函数索引)
  • @elethan 是的,尝试了反斜杠,它不起作用,编译时出错
  • 作为一个拥有超过 500 次代表的用户,您应该知道不要做出“给我错误”之类的陈述。

标签: mysql


【解决方案1】:

您正在尝试在同一个查询中组合查找和Transform。你一次只能做一个。这是因为Lookup automatically adds parentheses around lhs_params and rhs_params

当您尝试return 'UPPER(%s) LIKE UPPER(%%%s%%)' % (lhs, rhs), params 时,这是导致不支持字符错误的原因。

您需要构建您的Bilateral Transformer 以将两边都转换为大写,与您的查找函数分开。

您真正想要的是使用文档中的Transform__contains 相结合,它取代了您的LIKE 查找:

from django.db.models import Transform

class UpperCase(Transform):
    lookup_name = 'upper'
    function = 'UPPER'
    bilateral = True

您的查询将是:

YourObject.objects.filter(yourvalue__upper__contains="something")

【讨论】:

    【解决方案2】:

    您可以覆盖process_rhs 方法并修改那里的值:

    class MyCustomLookup(Lookup):
        lookup_name = 'custom_lookuptest'
        def as_sql(self, compiler, connection):
            lhs, lhs_params = self.process_lhs(compiler, connection)
            rhs, rhs_params = self.process_rhs(compiler, connection)
            params = lhs_params + rhs_params
            return 'UPPER(%s) LIKE UPPER(%s)' % (lhs, rhs), params
        def process_rhs(self, compiler, connection):
            value = '%%%s%%' % self.rhs
            if self.bilateral_transforms:
                if self.rhs_is_direct_value():
                    value = Value(value, output_field=self.lhs.output_field)
                value = self.apply_bilateral_transforms(value)
                value = value.resolve_expression(compiler.query)
            if hasattr(value, 'get_compiler'):
                value = value.get_compiler(connection=connection)
            if hasattr(value, 'as_sql'):
                sql, params = compiler.compile(value)
                return '(' + sql + ')', params
            if hasattr(value, '_as_sql'):
                sql, params = value._as_sql(connection=connection)
                return '(' + sql + ')', params
            else:
                return self.get_db_prep_lookup(value, connection)
    

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多