2012-08-06 21 views
0

我必須從表字段中獲取記錄/數據/字符串的長度大於8個字符的記錄。我不能使用任何字符串函數,因爲查詢必須在(MySQL,MSSQL,Oracle)上使用。如何根據字符串長度從數據庫中獲取數據而不使用任何字符串函數

我不想做下面的例子:

List<String> names = new ArrayList<String>(); 
String st = select 'name' from table; 

rs = executeSQL(st); 
if (rs != null) 
{ 
    rs.next(); 
    names.add(rs.getString(1)); 
} 

for(String name : names) 
{ 
    if(name.length() > 8) 
    result.add(name); 
} 

任何想法,其他則一個以上的編碼?一個查詢,它可以獲取所需的結果,而不是對檢索到的數據進行處理,然後獲取所需的結果。

謝謝你的任何幫助/線索。

回答

1

JDBC驅動程序可以爲JDBC規範的附錄D(標量函數)中列出的函數實現JDBC轉義。驅動程序應該將其支持的標量函數轉換爲數據庫端的相應函數。支持的功能列表可以用「DatabaseMetaData.getStringFunctions()」進行查詢

要使用此查詢中,那麼你要麼使用CHAR_LENGTH(string)LENGTH(string),如:

SELECT * FROM table WHERE {fn CHAR_LENGTH(field)} > 8 

您可以LENGTH取代CHAR_LENGTH 。驅動程序(如果它支持此功能)將轉換爲底層數據庫中的相應功能。

從部分13.4.1標量函數的JDBC 4.1規範的

附錄d「標量函數」提供的駕駛員預期支持標量函數 列表需要一個驅動程序。實施 這些功能然而,僅如果數據源支持它們。

爲標量函數的轉義語法必須只被用來調用附錄d「標量函數」中定義的 標量函數。語法不適用於調用用戶定義的或供應商的特定標量函數 。

+0

謝謝馬克。我不知道這些標量函數。 – 2012-08-06 11:18:27

+0

@SardarFaisal我認爲JDBC轉義並沒有被大量使用,所以它並沒有廣爲人知。 – 2012-08-06 16:13:51

1

我想你可能會更好地利用數據庫的強大功能併爲您的SQL語句(或者封裝SQL功能的對象)實現factory

通過這種方式,您可以使用數據庫的名稱/類型來配置工廠,並且它會爲您提供該數據庫的相應SQL語句。它爲您提供了一個乾淨的參數化信息的方法,同時允許您利用數據庫的功能,而不必在代碼中以不理想的方式複製數據庫功能。

例如

DabaseStatementFactory fac = DatabaseStatementFactory.for(NAME_OF_DATABASE); 
    String statement = fac.getLongNames(); 
    // then use this statement. It'll be configured for each db type 

這可能是明智的進一步封裝,並使用類似:

DabaseStatementFactory fac = DatabaseStatementFactory.for(NAME_OF_DATABASE); 
    List<String> names = fac.getLongNames(); 

這樣,你沒有做的假設重新。常見模式和查詢方式等。

+0

是的布萊恩你是對的,但在這裏我不知道什麼數據庫被查詢線索。我只需將查詢提供給另一個檢索並返回數據的組件。如果我明白你的話,那麼在我的情況下似乎是不可能的。謝謝 – 2012-08-06 09:54:25

+0

我找到的另一個解決方案是: 從表中選擇名稱,名稱如'________'; – 2012-08-06 11:20:39

0

另一種解決方案,我發現是:

Select name from table where name like '________'; 

SQL計數下劃線(_)字符,並返回長度等於下劃線字符數的名稱。

相關問題