Oracle SQL无法按预期工作
我有一个简单的查询,它选择了几行,有两个内部连接,还有两个where语句 然而,g.company在'2'和'21'之间的那一行Oracle SQL无法按预期工作,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我有一个简单的查询,它选择了几行,有两个内部连接,还有两个where语句 然而,g.company在'2'和'21'之间的那一行并没有像我预期的那样工作 当前代码 SELECT g.date_reg AS Date_Entered, g.userid AS UserID, x.account AS Account_Number, g.company AS Company_Number FROM gtable g INNER JOIN MSI f ON g.vt= f.vt AND g.comp
并没有像我预期的那样工作
当前代码
SELECT
g.date_reg AS Date_Entered,
g.userid AS UserID,
x.account AS Account_Number,
g.company AS Company_Number
FROM gtable g
INNER JOIN MSI f ON g.vt= f.vt AND g.company = f.company AND g.vn = f.vn
INNER JOIN grow x ON f.vn = x.vn AND f.cb = x.cb AND (f.dac = x.ca OR f.dad = x.da)
WHERE g.company BETWEEN '2' AND '21'
AND g.vn = '123123456'
AND g.year = '2014'
使用当前代码,我得到以下结果。
Date_Entered UserID Account_Number Company_Number
01/01/2014 AB01 1112 20
如果我将该行更改为,其中g.company在'1'和'21'之间
我得到以下信息:
Date_Entered UserID Account_Number Company_Number
03/03/2014 CD01 1312 19
02/02/2014 BG01 1412 19
01/01/2014 AB01 1112 20
Date_Entered UserID Account_Number Company_Number
03/03/2014 CD01 1312 02
02/02/2014 BG01 1412 02
03/03/2014 CD01 1312 03
02/02/2014 BG01 1412 05
03/03/2014 CD01 1312 05
02/02/2014 BG01 1412 05
03/03/2014 CD01 1312 06
02/02/2014 BG01 1412 06
03/03/2014 CD01 1312 07
02/02/2014 BG01 1412 07
03/03/2014 CD01 1312 07
02/02/2014 BG01 1412 07
03/03/2014 CD01 1312 07
02/02/2014 BG01 1412 08
03/03/2014 CD01 1312 08
02/02/2014 BG01 1412 08
03/03/2014 CD01 1312 09
02/02/2014 BG01 1412 09
03/03/2014 CD01 1312 19
02/02/2014 BG01 1412 19
01/01/2014 AB01 1112 20
这没有意义,因为我只改变了下限
更奇怪的是,如果我把它改成,其中g.company介于“0”和“21”之间
我得到以下信息:
Date_Entered UserID Account_Number Company_Number
03/03/2014 CD01 1312 19
02/02/2014 BG01 1412 19
01/01/2014 AB01 1112 20
Date_Entered UserID Account_Number Company_Number
03/03/2014 CD01 1312 02
02/02/2014 BG01 1412 02
03/03/2014 CD01 1312 03
02/02/2014 BG01 1412 05
03/03/2014 CD01 1312 05
02/02/2014 BG01 1412 05
03/03/2014 CD01 1312 06
02/02/2014 BG01 1412 06
03/03/2014 CD01 1312 07
02/02/2014 BG01 1412 07
03/03/2014 CD01 1312 07
02/02/2014 BG01 1412 07
03/03/2014 CD01 1312 07
02/02/2014 BG01 1412 08
03/03/2014 CD01 1312 08
02/02/2014 BG01 1412 08
03/03/2014 CD01 1312 09
02/02/2014 BG01 1412 09
03/03/2014 CD01 1312 19
02/02/2014 BG01 1412 19
01/01/2014 AB01 1112 20
我想从where语句中看到的是任何数字介于2和21之间(含2和21)的公司
WHERE g.company BETWEEN '0' AND '21'
我假设g.company来自char组(例如有VARCHAR2类型)<代码>'0'和'21'
来自char group=>Oracle使用这些ASCII代码比较字符串。在这种情况下
“0”<“1”<“2”<…<”9'=>“2'>“1[其他任何内容]”
如果您确定g.company
仅包含数字值,则可以尝试此方法
WHERE g.company BETWEEN 0 AND 21
(Oracle应将g.company
隐式转换为数字)
或者这个:
WHERE to_number(g.company) BETWEEN 0 AND 21
如果g.company
不仅可以包含数字值(而且您不需要这些值),那么您可以尝试以下方法:
WHERE case when regexp_like(g.company, '^[[:digit:]]+$') then to_number(g.company) else -1 end BETWEEN 0 AND 21
这似乎是数据类型问题,如果公司数据类型不是数字类型,那么
'2''02'
同样的事情也适用于其他值,这也意味着公司'02'不是公司#2,而是公司代码为'02'的公司(有一天可能会有一家公司代码为'X1')。对这个列应用数学是没有意义的,甚至不仅仅是数字范围。访问这些代码时,应始终明确地命名它们:其中g.company位于('01','02','03','04')
。