情境說明: UI有個選單可以讓 user 多選資料, 選完後會直接帶入SQL查詢相關資料, 並帶入下一個選單
因開發環境與工具的限制,所以僅能使用SQL解決以下問題,由於此限制有太多細節就不多做詳細說明
情境限制: 僅限直接使用SQL解決,無法再透過stored procedure或其它語言邏輯或API來做處理
情境舉例:
Table Name => Member
小王 | 台北市
小明 | 新北市
小華 | 高雄市
小菜 | 台中市
小花 | null
小北 | 台南市
小鹿 | null
小姐 | 台北市
小乖 | 台南市
小草 | null
UI 的選單
addrBoxList (可多選)
台北市
新北市
台中市
台南市
高雄市
null
nameBoxList
(addrBoxList選完後再帶入...)
選擇案例1 => user選了 台北市 和 高雄市, 會將選取的值先存到一個變數 ex; addrList, 再將值代入sql
SQL
SELECT name FROM Member WHERE addr IN (?addrList)
=> SELECT name FROM Member WHERE addr IN ('台北市', '高雄市')
篩選結果需帶入nameBoxList: 小王, 小姐, 小華
選擇案例2 => user選了 高雄市 和 null, 會將選取的值先存到一個變數 ex; addrList, 再將值代入sql
SQL
SELECT name FROM Member WHERE addr IN (?addrList)
=> SELECT name FROM Member WHERE addr IN ('高雄市', 'null')
篩選結果需帶入nameBoxList: 小華, 小北, 小鹿, 小草
遭遇問題:
由於SQL IN語法無法查詢null值, null值的查詢好像僅限使用 WHERE addr is null來查詢, 想請問是否有辦法可以用SQL語法來切換查詢語法的邏輯
例如可以用SQL做以下邏輯切換:
if(?addrList contains null){
SELECT name FROM Member WHERE addr IN ('高雄市') OR addr is null
}else{
SELECT name FROM Member WHERE addr IN ('台北市', '高雄市')
}
感謝~
CREATE TABLE Member(
name varchar2(20),
addr varchar2(20));
INSERT INTO Member (name,addr)
VALUES ('小王','台北市');
INSERT INTO Member (name,addr)
VALUES ('小明','新北市');
INSERT INTO Member (name,addr)
VALUES ('小華','高雄市');
INSERT INTO Member (name,addr)
VALUES ('小菜','台中市');
INSERT INTO Member (name,addr)
VALUES ('小花',null);
INSERT INTO Member (name,addr)
VALUES ('小北','台南市');
INSERT INTO Member (name,addr)
VALUES ('小鹿',null);
INSERT INTO Member (name,addr)
VALUES ('小姐','台北市');
INSERT INTO Member (name,addr)
VALUES ('小乖','台南市');
INSERT INTO Member (name,addr)
VALUES ('小草 ',null);
想辦法將 addrList 內的 'null' 用 '0' 取代
SELECT name
FROM (
SELECT name,NVL(addr,'0') AS addr
FROM Member) M
WHERE addr IN ('高雄市', '0')
你可以SQL語句寫 where 1=1
之後再程式端(out-side SQL)藉由
and xxx ....
and xxx ....
去動態串接
當然記得要參數化