如何找出以字母开头的值。
例如
我有数据
prodCode
12FDBC
34IO
ZklM
hOP
12-b.9
从上面我想拥有ZklM
并hOP
返回。我怎样才能做到这一点?
显而易见的答案是尽可能升级。我什至找不到对 8i 的扩展支持结束的日期;9i 是 2007 年 7 月 31 日,差不多 8 年前。
如果做不到这一点,你只需要列举你想要接受的所有字符;像这样的东西,太长了:
select *
from ...
where lower(substr(prod_code, 1, 1)) in ('a', 'b', ..., 'z')
或者这个,不太明显但更小:
select *
from ...
where trim(translate(lower(substr(prod_code, 1, 1))
, 'abcdefghijklmnopqrstuvwxyz', ' ')) is null
或者,您可以使用要接受和加入的字符创建一个表:
select *
from ... a
, alphabet b
where substr(a.prod_code, 1, 1) = b.character
最后,您可以使用该ASCII()
功能,我相当肯定它存在于 8i 中
select *
from ...
where ascii(lower(substr(a.prod_code, 1, 1))) between 97 and 122
在大多数情况下,我都会明确小写以使生活更轻松;如果你想要这个索引,你无论如何都会有一个功能索引,并且额外LOWER()
的不会有太大的不同。
我不熟悉oracle,但类似:WHERE REGEXP_LIKE(prodCode, '[aZ].*')
更新:它很难看,它适用于 MS SQL Server,但它可能会有所帮助(我不知道 Oracle 语法,我唯一知道从虚拟表中选择时需要添加 FROM dual):
SELECT
*
FROM
#test t
WHERE substr(a, 1, 1) BETWEEN 'a' AND 'Z'
或者
CREATE TABLE #test
(
a VARCHAR(100)
);
INSERT INTO #test VALUES ('12FDBC');
INSERT INTO #test VALUES ('34IO');
INSERT INTO #test VALUES ('ZklM');
INSERT INTO #test VALUES ('hOP');
INSERT INTO #test VALUES ('12-b.9');
SELECT * FROM #test t
WHERE NOT EXISTS (
SELECT * FROM (
SELECT '1' a
UNION ALL SELECT '2'
UNION ALL SELECT '3'
UNION ALL SELECT '4'
UNION ALL SELECT '5'
UNION ALL SELECT '6'
UNION ALL SELECT '7'
UNION ALL SELECT '8'
UNION ALL SELECT '9'
UNION ALL SELECT '0' ) a
WHERE t.a LIKE a.a + '%'
)