SQL 查詢的動態過濾器因此,我對 SQL 一無所知,所以我使用了 JMP 查詢生成器,並以此為基礎編寫了我的所有代碼。
基本上,我希望允許用戶通過彈出屏幕過濾他們想要的任何數據,在彈出屏幕中他們可以選擇要過濾的列,然後選擇他們想要過濾的值。JMP 表中的所有列都是數據庫中的有效列名稱。因此,我創建了一個關聯數組,其中包含用戶選擇的所有過濾器和值,其中鍵是過濾器。
我遇到的問題是在新的 SQL 查詢中,我可以使用“Where”進行實際過濾,我不確定如何添加關聯數組。
我確信有更好的方法來做到這一點。有什麼想法嗎?
_dt = Current Data Table();
selection = Associative Array();
//Create a window to collect filter information
TestIdWindow = New Window( "Filters Window",
<<MODAL></MODAL>
回复:SQL 查詢的動態過濾器謝謝斯蒂芬。今天讓我嘗試一下你的建議。我沒有考慮將整個 SQL 查詢創建為字符串,而只是將其中部分創建為字符串。
至於你關於只有 5-12 個選項可以過濾的評論,這實際上是最初的目標。但後來我無法決定我認為所有用戶都想要過濾哪些 5-12 件事,所以我想,如果我已經可以靜態地執行其中一些操作,那麼使其動態化會有多困難。然後它爆炸了,我就在這裡:)
回复:SQL 查詢的動態過濾器在 SQL 中使用分類列時,有一個稱為 _AllRows_ 的功能,如果用戶沒有選擇,您可以調用該功能:
//window for selection
// get data
PickFilter = Function( {chosenCostCentre},
//{Default Local},
//deal with user making no choice
If(NItems(chosenCostCentre[1])==0,
chosenCostCentre[1] = "_AllRows_";
);
...然後,如果沒有列表,您可以使用動態 JSL 插入此文本來代替列表:
...
//get report names from filter table
Eval(
Parse(
Eval Insert(
"\[
dtFilterNames = New SQL Query(
Connection( connectionString ),
QueryName( "RvwReports" ),
Select( Column( "ReportID", "t1" ), Column( "ReportName", "t1" ) ),
From( Table( "RvwReports", Schema( "dbo" ), Alias( "t1" ) ) ),
Where(
In List(
Column( "CostCentreCommon", "t1" ),
^chosenCostCentre[1]^,
UI( SelectListFilter( CheckBoxList, Base( "Categorical" ) ) )
)
)
) << Run Foreground( );
]\"
)
)
);同樣,使用動態 JSL,您可以將每個子句編寫為單獨的字符串,默認設置為 Clause="";並且僅當用戶從初始列列表中選擇該列進行過濾時才更新它們。
此時,如果您不通過預先決定 5-12 個最重要的列是什麼來限制用戶,那麼為什麼他們不使用內置 JMP 查詢生成器而您只編寫後 SQL JSL?
回复:SQL 查詢的動態過濾器我知道子句代碼是什麼,但用戶可能不想只對某些列的每一列進行過濾。某些子句代碼可以與無比較嗎?
另外,可能有近一百列,我不想為每一列顯式添加子句代碼。
我確實用幾列測試了這一點,但我試圖動態構建這個 where 子句。我在代碼中採取了一些預防措施,強制所有子句都是分類的...但我只需要弄清楚如何動態地使用列表中的 where 子句。
Where(
In List(
Column( "Column 1", "t1" ),
{"some value 1",
"some value 2"},
UI( SelectListFilter( ListBox, Base( "Categorical" ) ) )
) & In List(
Column( "Column 2", "t1" ),
{Some value 3, some value 4},
UI( SelectListFilter( ListBox, Base( "Categorical" ) ) )
)
)
回复:SQL 查詢的動態過濾器首先嘗試運行 SQL 查詢,並將所有過濾器手動應用於用戶將從中選擇的列。 這將生成所需的 where 子句代碼,您可以將用戶選擇的值列表放入其中。