2

我需要執行在Sybase以下模式的方式:的Sybase - 對於子句參數

SELECT * FROM TBL其中X IN(@list)

的選擇將是一個存儲的一部分從Web表單傳遞值的過程。我希望允許用戶爲每個字段輸入0到許多搜索鍵,其中多個值由分隔符分隔輸入。目前我可以處理0到1個鍵,但不是> 1。

我一直在試圖找到一個類似於上面的僞SQL的優雅的解決方案,雖然我發現其他DB似乎有內置的方式來支持(例如數組),但它似乎並不Sybase有一個簡單的答案。

任何幫助,將不勝感激。請讓我知道,如果更多的細節會有所幫助。

+0

優雅的解決方案是一個分貝接受一個陣列或CTE。如果沒有他們,這將有一個醉酒的大象踩着高蹺的恩典。您可以傳遞一個以逗號分隔的值作爲參數,然後將其切入臨時表並使用連接而不是in。 – 2013-02-21 20:33:21

+0

不幸的是,我被困在當前的技術堆棧中。我認爲將一個字符串切成臨時表可能是最可靠的方式,就像那樣糟糕。 – SilverSN95 2013-02-21 21:15:39

+0

至少它隱藏了前端代碼中的亂七八糟,如果出錯,你可以責怪DBA。 :) – 2013-02-21 21:28:39

回答

1

你不能在SQL中做到這一點。最好的選擇是做字符串比較:

select * 
from tbl 
where ','[email protected]+',' like '%,'+x+',%' 

或者,如果您所創建的語句作爲動態SQL,那麼你就可以把清單到SQL查詢字符串。

0

我剛剛回答了一個非常類似的問題與PHP和MySQL,但我覺得答案同樣適用於這裏,所以我會複製/粘貼它。

我只是在Visual Studio中處理了同樣的問題。首先,我創建了一串參數添加到SQL語句中。你只需要對付問號,這麼多的我做了什麼比你更需要的(?):

string[] inClause = new string[keywordTerms.Length]; 

for (int i = 0; i < keywordTerms.Length; i++) 
    inClause[i] = ":keyword" + i.ToString("00"); 

然後創建我的選擇的時候,我把以下內容:

sqlStatement += "WHERE kw.keyword IN (" + String.Join(", ", inClause) + ")" 

最後,我在此代碼中添加了參數:

for (int i = 0; i < keywordTerms.Length; i++) 
    cmd.Parameters.Add(inClause[i], OracleDbType.Varchar2, 20, "keyword").Value = keywordTerms[i]; 

希望對您有所幫助!

1

試試這個方法:如果

declare @list varchar(100) 

select @list = '1,2,3,4,5' 

exec('SELECT * FROM tbl WHERE x IN ('[email protected]+')')