我想要一个查询,如果用户没有选择任何内容,则返回一个空列表。 以下是根据以下 JMP 查询生成器页面修改的示例。
https://www.jmp.com/support/help/14/query-and-join-data-tables-with-jmp-query-builde.shtml
我没有像网页上那样按分数进行过滤,而是对其进行了修改,以便用户选择状态。 当未选择任何状态时,我想要返回一个空列表或表格。
New SQL Query(
Version( 130 ), Connection( "JMP" ),
JMP Tables(
["SAT" => "\C:\Program Files\SAS\JMPPRO\14\Samples\Data\SAT.jmp",
"SATByYear" => "\C:\Program Files\SAS\JMPPRO\14\Samples\Data\SATByYear.jmp"]
),
QueryName( "SATQuery" ),
Select( Distinct,
Column( "State", "t1" ),
Column( "% Taking (2004)", "t1" ),
Column( "2004 Verbal", "t2" ),
Column( "2004 Math", "t2" )
),
From(
Table( "SATByYear", Alias( "t1" ) ),
Table( "SAT", Alias( "t2" ),
Join( Type( Left Outer ),
EQ( Column( "State", "t1" ), Column( "State", "t2" ) ) &
EQ( Column( "% Taking (2004)", "t1" ),
Column( "% Taking (2004)", "t2" ) )
& EQ( Column( "X", "t1" ), Column( "X", "t2" ) )
& EQ( Column( "Y", "t1" ), Column( "Y", "t2" ) )
& EQ( Column( "Population", "t1" ), Column( "Population", "t2" ) )
& EQ( Column( "Latitude", "t1" ), Column( "Latitude", "t2" ) )
& EQ( Column( "Longitude", "t1" ), Column( "Longitude", "t2" ) )
)
)
),
Where(
In List( Column( "State", "t1" ),
_AllRows_,
UI( SelectListFilter(
ListBox,
Base( "Categorical",
Prompt( "State:", Character, PromptName( "t1.State_1" ),
ValueSource( Column( "State", Alias( "State" ), Table( "SATByYear" ) ) )
)
)
)
)
)
)
) << Run;如果可能的话,我认为这会发生在Where子句中。 我尝试过“Not In List”、“Not Or”,并用空列表 {} 替换 _AllRows_。 无论我做什么,如果没有从列表框中选择任何状态,则返回所有状态,否则我会收到错误。
我们正在设计一个应用程序,其中包含多个列表框来过滤 SQL 查询的选项。 有些列表框有数百个选择。 手动列表不好,因为用户不会知道所有的选择。 出于我们的目的,当未选择任何项目时,最好返回一个空列表。 这可能吗? 如果是这样,可以用我上面发布的 SAT 示例来演示吗?
感谢您的任何建议或见解。
selected_states = Data Table("SATQuery");
x=expr(selected_states<<GET script="">0,
selected_states<<SELECT all="" rows=""></SELECT></GET>我希望这次换行能够出现。
布莱恩,是的,我明白了。 如果未选择任何行,则 _AllRows_ 将写入表脚本。 然而,如果选择任何或所有州,则写入列表,例如{阿拉巴马州,阿拉斯加}。 因此,只要仅在未选择任何行时写入 _AllRows_ ,那么您的修复就会起作用。
对于读者来说,以下是我在原始帖子中添加到确切脚本中的内容。
selected_states = Data Table("SATQuery"); <BR />x=expr(selected_states<<GET script=""></GET>xx=char(eval(evalexpr(x)));<BR />if ( contains(xx, "_AllRows_") > 0,<BR /> selected_states<<SELECT all="" rows=""> selected_states<<DELETE rows=""></DELETE> Print("All Good")<BR />);</SELECT>它在 JMP 14 中适用于我。 桌子被清理干净了。 对于需要空列表的其他情况,它应该很容易修改。 并且,您可以省略打印行。
感谢这个解决方案/黑客。 我会等着看是否有人发布更好的内容。 如果没有,明天这将是公认的解决方案。
首先,感谢您发布了您正在做的事情的清晰示例。 很有帮助。
按照原样的脚本,尝试做这两件事。
1.运行脚本,什么都不选择,点击ok
2.运行脚本,选择全部(或部分状态)
比较两个结果表中的源脚本,特别是第 57 行左右。
当没有选择任何内容时,它与选择所有内容时确实不同。
这完全是作弊,但确实有效!
在脚本的开头编辑第一行,如下所示:
dtq=New SQL Query(
将这些行添加到脚本的底部。
x=expr(dtq<<GET script="">0,
dtq<<SELECT all="" rows=""><BR /></SELECT></GET>
该查询返回一个数据表,以 dtq 作为句柄。 然后脚本从表中获取源脚本并将其转换为带引号的字符串,以“xx”作为其句柄。 Contains 参数检查是否包含整个表,当对话框中未选择任何内容时会发生这种情况。 在本例中,文本“_AllRows_”包含在源脚本中。 如果这是真的,那么表中的所有行都会被选择然后删除。
就像我说的,这完全是作弊,但在这种情况下它是有效的。
感谢您的回复,斯蒂芬。 我很难看出动态编程将如何解决我的问题。
我知道这些子句是什么,除了如果用户未选择任何内容则返回空列表。 每个用户都需要在任何地方过滤一些已知的列,从从该列中不选择任何内容到选择所有内容,以及介于两者之间的任何内容。 如果用户没有在列表中选择任何内容,我希望没有一个是默认值。 在我发布的 SAT 示例中,问题是如果用户未选择任何状态,如何返回零状态。
我不明白动态构建子句有什么帮助,尽管我可能会遗漏一些东西。 换句话说,即使我动态构建子句,如果没有选择任何内容,我也看不到要动态放入过滤器中以返回空列表的内容。 而且,如果它可以输入动态过滤器,那么为什么不能将其静态编程到一组已知的列表框过滤器中?
强力方法是将用户的每个子句构建为字符串,然后使用动态 JSL 来运行组合字符串。 查看相关问题: SQL 查询的动态过滤器