【发布时间】: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