Oracle 中的字符串比较 SQL

String comparision in Oracle SQL

select * from employees
 where last_name between 'A' AND 'E';

为什么直到 'D' 才得到答案而不是 'E',有没有其他方法可以获取详细信息

您的命令非常适合 "employees whose names are (not start with) from A to E"。 "E" 会在。"Einstein" 会被淘汰,因为它 "E"

WHERE last_name >= 'A' AND last_name < 'F'

给你想要的。

或者,您可以这样做

WHERE SUBSTR(last_name, 1, 1) BETWEEN 'A' AND 'E'

但它会很慢,因为它无法使用索引。

where last_name between 'A' AND 'E';

字符串比较与比较数字不相似。

字符串比较是在它们的 ASCII 值上完成的。因此,您将 last_name 的 ASCII 值与 单个字符 进行比较,这不会给出您想要的输出。

SQL> SELECT ename, ASCII(ename), ASCII('A'), ASCII('E') FROM emp;

ENAME      ASCII(ENAME) ASCII('A') ASCII('E')
---------- ------------ ---------- ----------
SMITH                83         65         69
ALLEN                65         65         69
WARD                 87         65         69
JONES                74         65         69
MARTIN               77         65         69
BLAKE                66         65         69
CLARK                67         65         69
SCOTT                83         65         69
KING                 75         65         69
TURNER               84         65         69
ADAMS                65         65         69
JAMES                74         65         69
FORD                 70         65         69
MILLER               77         65         69

14 rows selected.

SQL>

基于上面的 ASCII 值,您将只获得那些在 65 和 [=14] 之间具有 ename ASCII 值的行=].

需要先用SUBSTR提取last_name的第一个字符,与'A''E'进行比较。

例如,我在 SCOTT 架构中使用标准 emp table,并添加两行 ename 以 'D''E' 开头的行。

SQL> WITH DATA AS(
  2  SELECT ename FROM emp
  3  UNION
  4  SELECT 'DAWSON' FROM DUAL
  5  UNION
  6  SELECT 'EINSTEIN' FROM DUAL
  7  )
  8  SELECT * FROM DATA
  9  WHERE substr(ename,1,1) BETWEEN 'A' AND 'E';

ENAME
----------
ADAMS
ALLEN
BLAKE
CLARK
DAWSON
EINSTEIN

6 rows selected.
SELECT * FROM EMPLOYEES
WHERE Last_name Like 'A%'
OR Last_name Like 'E%';

这应该是答案....您编写的代码将准确显示 A 和 E 的名称....