Oracle SQL无法按预期工作

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

我有一个简单的查询,它选择了几行,有两个内部连接,还有两个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.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')