iT邦幫忙

0

SQL 如果A欄位是NULL ,則以B欄位為判斷

sql
tanpen 2012-10-26 09:24:1830571 瀏覽

情況是想在在一次的語法中判斷如果A欄位沒有值,就以B欄位去判斷大小,
是用在程式中的SQL抓取資料用..
以前可能開第一之資料庫,先讀取資料,A沒有值.
再開第二次資料,以B欄位為過濾條件..
可是這樣要開二次資料庫很麻煩也沒效率,想說有沒有方法在一次的SQL語法裡就作完..
謝謝

建議你
寫出一些範例資料
會比較容易得到你想要的答案
jamesjan iT邦高手 1 級 ‧ 2012-10-26 10:24:15 檢舉
select * from table where C>isnull(A,B)
10
charmmih
iT邦研究生 5 級 ‧ 2012-10-26 10:04:39
最佳解答
  1. 有3種方式, 可以自行去評估看看那種寫法效能較好

select A,B,C...
from t1
where (isnull(A,B)='xxxxxx')

或是

select A,B,C...
from t1
where (A='xxxxx')
union
select A,B,C...
from t1
where (A is null and B='xxxx' )

或是

select A,B,C...
from t1
where (A='xxxxx') or ( A is null and B='xxxx' )

  1. 建好索引
    CREATE NONCLUSTERED INDEX IX_T1_A ON T1(A);
    CREATE NONCLUSTERED INDEX IX_T1_B ON T1(B);
看更多先前的回應...收起先前的回應...
tanpen iT邦研究生 3 級 ‧ 2012-10-26 13:30:30 檢舉

你的方法,我試過仍不能得到正確答案,不過你的作法讓我靈光一閃..
如果一個table 內我要A,和B欄位的欄位,如果其中一個NULL我才去用另一欄位判斷.
那也可以這麼想把兩個欄位作合併
方法是 如果A=NULL,就抓B欄位的值,否則抓A欄位的值,合併成一新的欄位
(CASE When A IS NULL Then B Else A End )AS A1
那個A1欄位都是我要的資料嘍..用它去作where 過濾及取值..
就完成了..以上是我的作法,可以達到要的東西,當然如果別人還有更好更有效率的作法也歡迎回應..

謝謝以上大大們回應...感恩

賽門 iT邦超人 1 級 ‧ 2012-10-26 17:29:21 檢舉

為什麼 SELECT ISNULL(A, B) .... 不行呢??

argyle iT邦新手 4 級 ‧ 2012-10-29 05:01:24 檢舉

CASE When A IS NULL Then B Else A End
小的同意CASE WHEN會是最方便的做法.

charmmih iT邦研究生 5 級 ‧ 2012-10-29 10:24:53 檢舉

tanpen提到:
(CASE When A IS NULL Then B Else A End )AS A1

確實, 改善方法, 可在新增資料時, 做好欄位的轉換或運算,
再SQL的 where 子句做單純的判斷...

4
pantc328
iT邦研究生 1 級 ‧ 2012-10-26 09:37:01

SELECT ISNULL(a.a,b.b) as xx tableA a
RIGHT JOIN tableB b
ON b.aID=a.a.aID

tanpen iT邦研究生 3 級 ‧ 2012-10-26 09:44:30 檢舉

是同一個TABLE的A欄位,和B欄位..
是用來過濾資料,如果A沒有值,就用B欄位過濾..

6
summertw
iT邦好手 1 級 ‧ 2012-10-26 20:11:23

(CASE When A IS NULL Then B Else A End )AS A1
這是取值,而非你所要求的
如果A欄位沒有值,就以B欄位去判斷大小
判斷式...
若是一個Table下,取其欄位值,而以A、B兩個欄位為判斷取值的要求,或許,可以試試下列寫法..
Select * From TableName
Where (Case
When TableName.A Is Not NULL Then TableName.A
Else TableName.B
End) = ConditionValue
最後,祝你成功...

charmmih iT邦研究生 5 級 ‧ 2012-10-29 10:23:05 檢舉

summertw提到:
When TableName.A Is Not NULL Then TableName.A
Else TableName.B
End) = ConditionValue

不建議這種寫法,
儘量不要在 where 子句做運算或轉換, 最好只做單純判斷

charmmih iT邦研究生 5 級 ‧ 2012-10-29 13:22:41 檢舉

charmmih提到:
儘量不要在 where 子句做運算或轉換, 最好只做單純判斷

儘量不要在 where 子句做欄位運算或轉換, 最好只做單純欄位判斷

我要發表回答

立即登入回答