怎樣判斷日期格式的字段startDate(2016-06-30)是否存在於字符串格式的字段startDateStr(2014-08-05,2016-06-30,2017-04-30)裏 ?
我剛開始思路是在sql語句,把startDateStr根據逗號分隔成多個日期格式的數組,再用sql關鍵字in進行判斷,但是對sql的分隔、數組不熟,搞了半天都沒有成功,後來直接問同事,他一下子就寫出來了...自己果然經驗不夠啊。沒錯,是用EXISTS關鍵字。
SELECT * FROM A a WHERE EXISTS( SELECT 1 FROM B b WHERE b.startDateStr like '%' || to_char(a.startDate,'yyyy-mm-dd') || '%');
思路也就是類似以下的sql:
SELECT * FROM A a WHERE a.startDate IN (SELECT b.startDateStr FROM b);
Oracle中in和exists的選擇:
然後搜索了一些資料,關於Oracle中in和exists的選擇,主要是效率的比較。
1.子查詢結果集小,用IN
2.外表小,子查詢表大,用EXISTS
簡單說明:
a表的數據小,b表數據大時用exists。a爲外表(也爲主表)
SELECT * FROM a WHERE EXISTS( SELECT 1 FROM b WHERE a.employee_id=b.employee_id);
b表數據量小(子表)時,用in。
SELECT * FROM a WHERE a.employee_id IN (SELECT b.employee_id FROM b);