我想要一個查詢,如果用戶沒有選擇任何內容,則傳回一個空列表。 以下是根據以下 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 查詢的動態篩選器