iT邦幫忙

0

oracle SQL是否可以做查詢語法的邏輯切換呢?

  • 分享至 

  • xImage

情境說明: UI有個選單可以讓 user 多選資料, 選完後會直接帶入SQL查詢相關資料, 並帶入下一個選單
因開發環境與工具的限制,所以僅能使用SQL解決以下問題,由於此限制有太多細節就不多做詳細說明

情境限制: 僅限直接使用SQL解決,無法再透過stored procedure或其它語言邏輯或API來做處理

情境舉例:

Table Name => Member

name | addr

小王 | 台北市
小明 | 新北市
小華 | 高雄市
小菜 | 台中市
小花 | 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 ('台北市', '高雄市')
}

感謝~

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
rogeryao
iT邦超人 8 級 ‧ 2021-11-07 20:33:10
最佳解答
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')

Demo

1
Samuel
iT邦好手 1 級 ‧ 2021-11-08 12:53:48

你可以SQL語句寫 where 1=1
之後再程式端(out-side SQL)藉由
and xxx ....
and xxx ....
去動態串接

當然記得要參數化

我要發表回答

立即登入回答