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 子句代码,您可以将用户选择的值列表放入其中。