当前位置: 首页 > 知识库问答 >
问题:

mybatis oracle-使用instr func按in子句中值的顺序排序

陆臻
2023-03-14

我想使用instr函数按照in子句中值的顺序对查询结果进行排序。

映射器

public List<String> getFilePaths(@Param("ids") Integer[] ids)

XML

<select id="getFilePaths" resultType="java.lang.String">
  select filepath from t_file where id in
  <foreach item="fileid" collection="ids" separator="," open="(" close=")">
    #{fileid}
  </foreach>
  order by instr('
  <foreach item="fileid" collection="ids" separator=",">
    #{fileid}
  </foreach>
  ',id)
</select>

当ids集合为[1,2,3]时,mybatis生成的sql为:

select filepath from t_file where id in (?, ?, ?) order by instr('?, ?, ?', id)

在如下所示更改用于测试的xml之后,不会发生异常。

<select id="getFilePaths" resultType="java.lang.String">
  select filepath from t_file where id in
  <foreach item="fileid" collection="ids" separator="," open="(" close=")">
    #{fileid}
  </foreach>
  and id in
  <foreach item="fileid" collection="ids" separator="," open="(" close=")">
    #{fileid}
  </foreach>
</select>

Preparing: select filepath from t_file where id in (?, ?, ?) and id in (?, ?, ?)
Parameters: 1, 2, 3, 1, 2, 3

共有1个答案

巫马山
2023-03-14

不能在文字中使用#{}。在第二个foreach循环中使用${fileId}
请参阅此FAQ条目。

order by instr('
<foreach item="fileid" collection="ids" separator=",">
  ${fileid}
</foreach>
',id)

可能有一些先决条件,但排序逻辑似乎不可靠。
例如,当IDS[222,22,2]时,INSTR将为所有三行返回相同的值。

 类似资料:
  • 问题内容: 我想知道是否有按IN()子句中的值顺序进行排序的方法(可能是一种更好的方法)。 问题是我有2个查询,一个查询获取所有ID,第二个查询获取所有信息。第一个创建我要第二个排序的ID的顺序。这些ID以正确的顺序放入IN()子句中。 因此,它类似于(极其简化): 问题在于第二个查询不会以将ID放入IN()子句中的顺序来返回结果。 我发现的一种解决方案是将所有ID放入具有自动递增字段的临时表中,

  • 问题内容: 我想知道是否有按IN()子句中的值顺序进行排序的方法(可能是一种更好的方法)。 问题是我有2个查询,一个查询获取所有ID,第二个查询获取所有信息。第一个创建我要第二个排序的ID的顺序。这些ID以正确的顺序放入IN()子句中。 因此,它类似于(极其简化): 问题在于第二个查询不会以将ID放入IN()子句中的顺序来返回结果。 我发现的一种解决方案是将所有ID放入具有自动递增字段的临时表中,

  • 问题内容: 我正在从具有整数id值的大型表(数百万行)中选择一组帐户记录。从某种意义上说,查询是最基本的。我正在做的是建立一个大型的逗号分隔列表,并将其作为“ in”子句传递到查询中。现在,结果是完全无序的。我想做的是按“ in”子句中的值顺序返回结果。 我想我将不得不建立一个临时表并进行联接,这是我想避免的,但可能无法做到。 有什么想法吗?现在,由于我们正试图限制输出大小,每个查询的大小上限为6

  • 问题内容: 是否可以保留“ IN”条件子句的顺序? 我在SO上发现了这个问题,但在他的示例中,OP已经有一个排序的“ IN”子句。 我的情况不同,’IN’子句的顺序是随机的: 我想按(45,2,445,12,789)顺序检索结果。我正在使用Oracle数据库。也许SQL中有一个属性,我可以将其与条件子句一起使用以指定保持子句的顺序。 问题答案: 除非您使用ORDER BY子句..否则不会有可靠的排

  • 问题内容: 当我使用IN从表中选择一组行时,例如 有一种SQL技巧可以按照IN集合中给定的顺序恢复它们吗? 因此,在示例中,假设x具有ID为23、55、44和12的行,则将按该顺序返回这四行。 问题答案:

  • 问题内容: 这个问题与执行顺序无关。这只是关于ORDER BY。 在标准执行中是: FROM WHERE GROUP BY HAVING SELECT ORDER BY TOP 编辑:这个问题或多或少是“ 执行ORDER BY表达式时SQL Server是否应用短路评估吗? ”的答案是有时!我只是还没有找到一个合理的理由。参见编辑#4。 现在假设我有一个这样的声明: 这不是我要执行的真实语句,而只