亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

記一次Oracle數據庫in語句事故

標簽:
Oracle

1、前情介绍

有个数据处理的活比较着急,从同事的代码中拷贝了一段SQL语句,其中,包含如下的语句:

SELECT *
FROM a
WHERE col IN
    (SELECT col
     FROM b
     WHERE b_col=col_val)

这段sql并不难懂,就是返回a表中col的值满足in子句中查询条件的结果。但是,我在实际中遇到的情况是,这个in子句一直不生效,这个语句也不报错。查了半天,最后发现b表没有名为col的列。

2、原因分析

如果b表没有col列时,这个语句就相当于:

SELECT *
FROM a
WHERE 'a' IN
    (SELECT 'a'
     FROM b
     WHERE b_col=col_val)

只要子查询能够查会结果,这个in子句就会返回true。这样,就导致了这个筛选条件实际不生效。而且,并不报错,在实际中特别不好分析。

3、场景复现

为了复现这个场景,这里用如下的表结构和数据:

CREATE TABLE Persons(
Name varchar(255),
Address varchar(255));INSERT INTO Persons VALUES ('Bill Gates', 'Beijing');INSERT INTO Persons VALUES ('Kobe Byrant', 'Los Angeles');CREATE TABLE Citys(
CityName varchar(255),
ZipCode varchar(255));INSERT INTO Citys VALUES ('Beijing', '010');

当执行如下查询:

SELECT *
FROM persons
WHERE Name IN
    (SELECT Name
     FROM citys
     WHERE zipCode='010')

得到结果:

NAMEADDRESS
Bill GatesBeijing
Kobe ByrantLos Angeles

而在执行如下查询时,查不到结果:

SELECT *
FROM persons
WHERE Name IN
    (SELECT Name
     FROM citys
     WHERE zipCode='251718')

4、写在最后

这种问题,在学校那会儿,肯定有一大堆语料强调过。然而,这种问题,不结结实实被坑一次,应该不会长记性。
接下来,推荐两个SQL在线测试的网站:



作者:SpaceCat
链接:https://www.jianshu.com/p/664073fe12d2


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
205
獲贊與收藏
1011

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消