【问题标题】:Sort by first digits of a number column按数字列的前几位排序
【发布时间】:2013-12-19 05:12:04
【问题描述】:

我有一张桌子:

CREATE TABLE client_details(
   ...
   clientid number(10,0) ,
   name varchar2,
   ...
)

clientid 可能是某个唯一编号(来自其他来源的外部 ID)。

我需要通过clientd实现过滤,所以系统会显示clientid处的所有记录用户输入的值开始

例如:

让表包含以下数据:

[{clientId=119, name='Bob'},
 {clientId=11234,name='Anna'},
 {clientId=2,name='Eva'}]

当用户输入“11”作为搜索查询时,系统会显示:

[{clientId=119, name='Bob'},
 {clientId=11234,name='Anna'}]

当用户输入“2”作为搜索查询时,系统会显示:

 [{clientId=2, name='Eva'}]

用户可以输入 0 到 999999999 之间的任意数字作为查询。

我的初衷是用类似的东西

SELECT * 
FROM client_details
WHERE SUBSTR(client, 0, length_of_query) = 'query'

(其中 query 代表用户输入,length_of_query 代表查询长度作为字符串)

我有点不喜欢 substr 并将 int 转换为 string in where, s.a.桌子可能很大。另一方面,我不希望更改数据库结构。

也许有人有更好的主意?

【问题讨论】:

  • 我认为你不喜欢的方法是最有效的。
  • 我也不喜欢substr,因为它只能在原始列的固定长度substr 上创建基于函数的索引——使用不同长度的substr 表达式不会使用那个索引。
  • 如果给数字的第一个数字赋予某种含义是有效的,那么你所拥有的不是数字,而是唯一合法字符是数字的字符串。您可能应该重新考虑将其存储在数字数据类型中。
  • 我的错,很抱歉这个令人困惑的例子。它不仅仅是第一个数字,它可能是其中的几个。例如,用户可以输入 179,这意味着“检索所有 clientid 以 179 开头的记录”,例如 1790、179、179237884

标签: sql oracle


【解决方案1】:

转换为字符串并使用like 运算符:

SELECT *
FROM client_details
WHERE TO_CHAR(clientId) LIKE <<query>> || '%'

client_details(TO_CHAR(clientId)) 上创建索引,当用户键入多个数字时,您也会获得出色的性能。

【讨论】:

    【解决方案2】:

    执行 CONVERSION using(CAST or CONVERT) 并使用 LIKE 运算符,但在更改数据类型之前请阅读 these Tutorial

    SELECT *  
    FROM [Clients_details]  
    WHERE CAST(clientId AS Varchar(50)) LIKE 'query%';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 2016-01-28
      • 2016-07-05
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多