由于公司最近将oracle項目移植到db2 中間出現了很多相容性問題,這裡主要記錄下hibernate中模糊查詢的相容性問題
例子(hql):from table t where t.name like '%' || t.displayName || '%';
如果遇到這種情況,在oracle裡面是完美相容,到了db2就出問題了
解決方案:使用locate函數,上面這種情況可以修改成如下
from table t where locate(t.dispalyName,t.name)>0;//這裡等于1就等同于上面sql語句的結果
from table t where locate(t.dispalyName,t.name)=1;,//1就是在name中從第一位開始比對displayName
from table t where locate(t.dispalyName,t.name)=0;//等于0的結果是排除模糊比對到的結果,也就是查出匹 配不到的所有資料;
from table t where locate(t.dispalyName,t.name)=2;//2就是在t.name中從第二位開始比對dispalyName;
接下來=3,4,5,6相信大家都了解了.
locate(String param1,String param2,int param3) 從param2的第param3位置開始,傳回param1第一次出現的位置,param3為負數的情況暫時還沒去研究.
hibernate中使用locate會根據你配置的不同方言去解析對應的函數
注意:oracle中locate的參數是反的!!!!
在oracle中要達到上面例子的結果要這樣寫:from table t where locate(t.name,t.dispalyName)=1;
下面是官方執行個體(可以參考):
LOCATE 函數 [String]
傳回一個字元串在另一個字元串中的位置。
文法
LOCATE( string-expression-1, string-expression-2 [, integer-expression ] )
參數
- string-expression-1 被搜尋的字元串。
- string-expression-2 要搜尋的字元串。此字元串的長度不應超過 255 個位元組。
- integer-expression 字元串中開始進行搜尋的字元位置。第一個字元在位置 1。如果起始偏移是負值,則定位函數傳回最後一個比對字元串偏移而非第一個。負的偏移訓示從搜尋中排除字元串尾的多長一部分。排除的位元組數計算公式為 (-1 * 偏移) -1。
傳回值
INT
注釋
如果指定了 integer-expression,則從字元串中的該偏移處開始搜尋。
第一個字元串可以是長字元串(長于 255 個位元組),但第二個字元串的長度不能超過 255 個位元組。如果第二個參數是長字元串,此函數傳回 NULL 值。如果未找到字元串,則傳回 0。搜尋零長度字元串将傳回 1。如果有某個參數為 NULL,則結果為 NULL。
如果使用多位元組字元,并具有适當的歸類,則開始位置和傳回值可能不同于位元組 的位置。
此函數支援 NCHAR 輸入和/或輸出。
另請參見
- 字元串函數
- CHARINDEX 函數 [String]
标準和相容性
- SQL/2008 服務商擴充。
示例
以下語句傳回值 8。
|
以下語句
|
傳回以下輸出:
str | pos | path | filename |
---|---|---|---|
c:\test\functions\locate.sql | 18 | c:\test\functions | locate.sql |