2015-03-25 95 views
0

如何找出以字母開頭的值。以字母開頭的返回值

例如

我有數據

prodCode 

12FDBC 
34IO 
ZklM 
hOP 
12-b.9  

從上面我想有ZklMhOP返回。 我該怎麼做?

+0

爲什麼's.kl'被排除,因此它以字母表開頭 – 2015-03-25 08:27:35

+0

@NoDisplayName這是一個錯字,已刪除。謝謝 – user75ponic 2015-03-25 08:28:58

+0

它是哪種語言? (它是字母A-Z,加上小寫字母還是別的東西?) – jarlh 2015-03-25 08:30:23

回答

2

答案顯然是升級如果所有可能的。我甚至找不到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()不會有太大的區別。

+0

謝謝Ben,ASCII是最高效的。讚賞。 – user75ponic 2015-03-25 08:46:01

0

我不熟悉Oracle,但類似:WHERE REGEXP_LIKE(prodCode, '[aZ].*')

更新: 這是醜陋的,它是MS SQL Server,但它可能會幫助(我不知道甲骨文語法,我唯一知道的事情你需要添加FROM雙當您從虛表中選擇):

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

正則表達式,加入10g;這是之前的兩個主要版本,所以無法正常工作。加上正則表達式本身是不正確的... – Ben 2015-03-25 08:27:35

+0

最好做UPPER(SUBSTRING(prodCode FROM 1 for 1))IN('A','B'... – jarlh 2015-03-25 08:36:12

+0

In is very slow operator,and when you so so許多論點我認爲它應該是慢的 – 2015-03-25 08:38:09