iT邦幫忙

0

SQL 指令要如何下呢?

要設計一個查詢,有2個查詢條件,假設typeid是職稱,dep是部門,若2個查詢條件都有輸入則SQL指令是
select * from a
where typeid='助理' and dept='it'

但若是若只輸入typeid是助理,沒輸入dep是部門,則顥示所有公司全部部門的助理,而且where 條件中dept一定要存在,SQL指令要怎麼下?
不能是
select * from a
where typeid='助理'

(ISNULL(@dept,'') = '' or dept = @dept ) and typeid = @typeid
0
純真的人
iT邦高手 1 級 ‧ 2019-03-14 17:28:29

這樣?

select * from a
where typeid='助理' 
and dept <> ''

或是..

select * from a
where typeid='助理' 
and dept like '%%'
1
kk9013203
iT邦新手 5 級 ‧ 2019-03-14 17:28:57

先假設 @typeid = 你輸入的職稱條件 @dept = 你輸入的部門條件

DECLARE @typeid nvarchar(50)
DECLARE @dept nvarchar(50)

SET @typeid = 你的條件 '' or 助理
SET @dept = 你的條件 '' or it

select * from a
where (typeid=@typeid or @typeid = '')
and (dept=@dept or @dept = '')

0
rogeryao
iT邦研究生 4 級 ‧ 2019-03-15 09:36:08

基本上,這個問題最好在你開發的程式(PHP,JAVA...)內判斷 , 類似 :
IF (dep=='')
{
// 要執行的 SQL
select * from a
where typeid='助理'
}
ELSE
{
// 要執行的 SQL
select * from a
where typeid='助理' and dept='it'
}

不然就寫個 Stored Procedure 在裡面判斷 dep 是否為空值 , 組出你要的 SQL

1
thwu
iT邦新手 5 級 ‧ 2019-03-15 09:43:56
DECLARE @TypeID nvarchar(20), @Dept nvarchar(20)
SET @TypeID = '助理'
SET @Dept = 'it'

SELECT
  *
FROM
  RoleData
WHERE
  1 = 1
  AND typeid = @TypeID
  -- 這是新寫法,我現在在用
  AND dept = CASE WHEN @Dept = '' THEN dept ELSE @Dept END

這寫法還有一個好處,也是另一個建議:盡量不要使用 "空字串" 或 無輸入 來當做顯示全部的條件。
嚴謹一點使用一個類似 "ALL" 的字串來當做顯示全部,如此可以減少因為 bug 而沒有輸入到 Dept 資料時,誤顯示全部資料的情況。

AND dept = CASE WHEN @Dept = 'ALL' THEN dept ELSE @Dept END

(寧可沒出現,也不要出現不該出現的東西)

p.s. 以前我會使用以下這個寫法,但如果有部門名稱剛好是另一個部門的子字串時,就會誤判了。
再加上也只能用 "空字串" 來做為顯示全部條件,所以改成上面的寫法

-- 這是舊寫法,我已經不用了
AND dept LIKE '%%'
hheyjen iT邦新手 5 級 ‧ 2019-03-16 17:16:35 檢舉

請問where 1=1有什麼用意?

thwu iT邦新手 5 級 ‧ 2019-03-19 11:19:09 檢舉

只是在透過程式組 SQL 時比較方便而已,習慣了就不自覺也寫上去了 :P

我要發表回答

立即登入回答