2013-12-16 25 views
0

的第一個數字我有一個表:排序列的數量

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

clientid可能是(來自其他來源的外部ID)一些獨特的號碼。

我需要通過clientd實現濾波,所以系統會顯示所有記錄clientid始於用戶inputed值

例如:

讓表包含以下數據:

[{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' 

(其中查詢代表用戶輸入和length_of_query代表查詢長度字符串)

我有點討厭SUBSTR和轉換INT爲字符串在哪裏,sa桌子可能相當大。另一方面,我寧願不改變數據庫結構。

也許有人有一個更好的主意?

+0

我覺得你不喜歡的方法是最好的方法。 –

+0

我也不喜歡'substr',因爲它只能在原始列的固定長度'substr'上創建基於函數的索引 - 使用不同長度的'substr'表達式不會使用該索引。 –

+0

如果爲某個數字的第一個數字指定一些含義是有效的,那麼您所擁有的不是一個數字,而是一個只有合法字符是數字的字符串。您應該重新考慮將其存儲在數字數據類型中。 –

回答

3

轉換爲字符串,並使用like操作:

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

client_details(TO_CHAR(clientId))創建索引,你會得到很大的性能太當用戶鍵入比幾號了。

1

使用(CAST或CONVERT)執行轉換和使用LIKE操作但不要改變數據類型前閱讀theseTutorial

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