返回值以字母开头

时间:2015-03-25 08:19:22

标签: sql oracle8i

如何找出以字母开头的值。

E.g。

我有数据

prodCode

12FDBC
34IO
ZklM
hOP
12-b.9     

从上面我想回复ZklMhOP。 我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

显而易见的答案是尽可能升级。我甚至找不到8i扩展支持的日期;对于9i来说,差不多是8年前的2007-07-31。

如果做不到这一点,你只需要枚举你想要接受的所有角色;这样的事情,这个过长了:

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()不会产生太大的影响。

答案 1 :(得分:0)

我不熟悉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'

OR

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 + '%'
    )