【问题标题】:Symfony 2 / Oracle Querybuilder result is case sensitiveSymfony 2 / Oracle Querybuilder 结果区分大小写
【发布时间】:2016-06-07 23:39:13
【问题描述】:

我在 Symfony 2 中的查询结果有一个奇怪的行为。 我在 Oracle 数据库中有这样的数据,顺序是这样的:

  1. BU 4 2015
  2. bU 2
  3. BU C
  4. 总线
  5. BU 4 2014

注意,第二个数据中小写

我只想按字母顺序显示此列表,没有任何区分大小写的支持。 想要的结果:

- BU C
- bU 2
- BU 4 2014
- BU 4 2015
- BU S

现在,这里是使用 Symfony 2.5.12 制作的 Querybuilder:

 $queryBuilder = $this->createQueryBuilder('e');
 $queryBuilder->orderBy('e.name');

但是查询,按这个顺序显示我的列表:

- BU C
- BU 4 2014
- BU 4 2015
- BU S
- bU 2
  • 当我在我的 Oracle 数据库客户端中播放 symfony 2 分析器中显示的查询时,我得到了想要的结果。

  • 当我转储查询生成器结果时,我得到了错误的订单列表。

我设法通过这个解决了我的问题

$queryBuilder = $this->createQueryBuilder('e');
$queryBuilder
    ->select(e)
    ->addSelect('UPPER(e.name) as HIDDEN name')
    ->orderBy('name');

所以,我只想知道为什么我会在查询构建器中出现这种奇怪的行为?

谢谢。

【问题讨论】:

  • 对Oracle不太了解,但可能是排序规则的问题。

标签: php oracle symfony doctrine-orm query-builder


【解决方案1】:

首先,您的“想要的结果”实际上并不是按字母顺序排列的。不区分大小写的排序将产生以下顺序:

bU 2
BU 4 2014
BU 4 2015
BU C
BU S

其次,使用 Oracle SQL 进行不区分大小写排序的方法是在要排序的列上使用 UPPER()LOWER(),如下所示:

SELECT *
FROM e
ORDER BY UPPER(e.name);

最后,使用 Doctrine QueryBuilder 进行不区分大小写排序的方法正是您所做的:添加UPPER(e.name) as HIDDEN name,然后按该字段排序。

在这个例子中 QueryBuilder 没有奇怪的行为。

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多