這是正確的嗎?nvl,其中,IN子句
select * from t1
where nvl(t1.a,t1.b) in (select id from t2 where name = 'Apple')
a,b是來自t2的Id中的t1列。
我希望所有對「蘋果」無論是在t1.a或t1.b
如果爲空,ID將在B ID行。
如果b爲空,則id將在a中。
這是正確的嗎?nvl,其中,IN子句
select * from t1
where nvl(t1.a,t1.b) in (select id from t2 where name = 'Apple')
a,b是來自t2的Id中的t1列。
我希望所有對「蘋果」無論是在t1.a或t1.b
如果爲空,ID將在B ID行。
如果b爲空,則id將在a中。
我希望所有對「蘋果」無論是在t1.a或t1.b
不,這是不正確的ID行。
您的查詢後可得到t1.a
是t2
的id
行或者t1.a
是null
和t1.b
是t2
的id
。
你想:
select *
from t1
where EXISTS (select 1
from t2
where name = 'Apple'
and (t1.a = t2.id OR t1.b = t2.id))
或:
SELECT *
FROM t1
WHERE a IN (SELECT id FROM t2 WHERE name = 'Apple')
OR b IN (SELECT id FROM t2 WHERE name = 'Apple')
或者(如果需要強制執行的非匹配值的NULL
):
select *
from t1
where EXISTS (select 1
from t2
where name = 'Apple'
and ( (t1.a = t2.id AND t1.b IS NULL)
OR (t1.b = t2.id AND t1.a IS NULL)))
這是正確的,但效率低下。 我會寫
select * from t1
where t1.a in (select id from t2 where name = 'Apple')
union
select * from t1
where t1.b in (select id from t2 where name = 'Apple')
錯了。聯盟放棄重複。 – wolfrevokcats
如果在一個記錄一個和b的值-9999和蘋果的ID,你的查詢將不會返回的記錄,因爲一個不爲空,所以-9999與蘋果ID進行比較,而不是的b
值我的建議是,假設你有一個紀錄只有T2表示「蘋果」:
select *
from t1
where (select id from t2 where name = 'Apple') in (a, b)
如果你能在T2名爲「蘋果」有多個記錄那麼我建議這樣的:
select distinct t1.*
from t1
inner join t2
on t2.name = 'Apple'
and t2.id in (t1.a, t1.b)
你的問題在註釋中描述 - 在問題中的邏輯不正確,因爲值可能是-9999。你可以做你想要的:
select *
from t1
where (case when t1.a is null or t1.a = -9999 then t1.b else t1.a end) in
(select id from t2 where name = 'Apple');
你的代碼看起來像它做你想做的。我更喜歡'coalesce()',ANSI標準函數。 –
我似乎沒有得到我期待的結果與這個邏輯。 – Skn
確定a和b中至少有一個是否爲空? – trincot