2011-01-07 50 views
3

我們試圖在使用Advantage表達式引擎的CDX和ADT表上創建一個索引。是否可以使用SQL創建具有表達式引擎表達式的索引?

我們到目前爲止已經試過的代碼看起來是這樣的:

CREATE INDEX IDX1 ON TBL1 (STR(SOME_NUMBER_FIELD,6)+DTOS(SOME_DATE_FIELD)); 

是否有可能創建與使用SQL表達式STR(SOME_NUMBER_FIELD,6)+DTOS(SOME_DATE_FIELD)的指數?

我們嘗試用雙引號,單引號和括號引用表達式。

回答

5

您可以使用系統過程sp_CreateIndex做到這一點:

execute procedure sp_CreateIndex('test', null, 'idx1', 
      'str(empid,6)+dtos(doh)', null, 0, 0); 
1

骨架語法

CREATE INDEX index_name ON table_name(column_name); 

所以兩件事情需要發生爲您的代碼工作。

  1. 您的表達式必須評估爲現有列的名稱。
  2. 您的dbms必須接受列名中的表達式。

我認爲大多數dbms不接受列名的表達式。但也許你可以評估表達式並提交一個有效的SQL字符串。

+0

+1不是我的問題的解決方案,但肯定是一個很好的解釋,爲什麼它不這樣工作。 – 2011-01-07 16:25:46

1

馬克的答案是現貨。

您應該注意ADT中表達式索引的一件事是表達式中的任何空值將呈現整個表達式的結果爲null。這有時會導致開發人員從CDX切換到ADT時出現問題,因爲ADT表中支持NULL值。例如,如果empid或doh爲NULL,則上述表達式的結果將爲NULL。

需要注意的另一件事是某些表達式索引可能無法用於SQL優化。如果您打算大多采用SQL操作數據,它可能是更好的創建使用標準的SQL語法索引:

CREATE INDEX idx1 ON test(empid, doh) 

的服務器將使用的CDX和ADT指數的正確表達的照顧。並且SQL引擎可以使用該索引來優化選擇數據。

+0

感謝您的好處。但在我們的情況下,我們必須手動指定表達式,因爲它適用於索引重組工具。 – 2011-01-14 07:50:04