2012-11-06 50 views
1

我需要選擇以大寫擴展名結尾的列。sql:在數據庫中選擇大寫字段

例如,請看下錶。

id - picture 
1 - abc.JPG 
2 - def.jpg 
3 - 123.jpg 
4 - xyz.JPG 

結果應該給我行1和4,因爲JPG是大寫的。

任何人都可以幫忙嗎?

回答

3

我遠離專家,但大小寫敏感已經掛斷了我。你能修改你的表格結構嗎?有一兩件事可以幫助正在改變表的排序規則如下(SQLFiddle here):

CREATE TABLE pics (id INT, picture VARCHAR(200)) 
CHARACTER SET latin1 COLLATE latin1_general_cs; 
INSERT INTO pics VALUES 
(1, 'abc.JPG'), 
(2, 'def.jpg'), 
(3, '123.jpg'), 
(4, 'xyz.JPG') 

_cs代表case sensitive,我相信默認爲不區分大小寫,這使得基於案例的比較有點棘手。然後,可以使用下面的查詢,讓您行:

SELECT * 
FROM pics 
WHERE picture REGEXP '\.[[:upper:]+]$' 

如果您沒有訪問到你的基礎表,你可以嘗試以下方法,其中注塑列在不同的字符集(latin1),和然後改變了整理,以支持不區分大小寫的比較(SQLFiddle here):

SELECT * 
FROM pics 
WHERE CAST(picture AS CHAR CHARACTER SET latin1) 
     COLLATE latin1_general_cs REGEXP '\.[[:upper:]+]$' 
+0

這將大體上工作,但我相信如果擴展名包含數字或特殊字符以及字母,它將失敗。實際上,我們需要更多地瞭解文件名的多樣性。他們全部是8.3還是你有像「grand.canyon.jpeg」這樣的難題?有可能編寫一個能夠完全按照你想要的方式返回的程序,但它可以非常容易地從簡單到非常複雜。 –

+0

@BaconBits是的,沒錯。在這種情況下,我們可能可以調整爲更明確的正則表達式模式,是嗎?我現在不能測試,但是像'\。[A-Z0-9] + $'等等可能在這種情況下工作。可以肯定是錯了:) – RocketDonkey

+0

謝謝@RocketDonkey更改表整理它爲我做的:) – apak

0

大多數SQL語言有UCASE或UPPER函數將文本轉換爲大寫。我還利用了RIGHT函數,這不是所有的SQL方言。如果你的SQL沒有RIGHT函數,你必須使用SUBSTRING和LENGTH來獲得正確的三個字符。

Select id, picture 
    from table 
where UPPER(RIGHT(TRIM(picture),3)) = RIGHT(TRIM(picture),3) 

如果轉換爲大寫相同的文字是相同的未轉化的文本,然後它在數據庫中大寫和將被選中。

0

,因爲它不能總是假定文件擴展名爲3個字母,你可以使用以下方法來獲取第一張圖的時間後,並進行比較,看它是否是大寫:

select * from table where SUBSTRING(picture,CHARINDEX('.',picture) + 1,1) 
    = upper(SUBSTRING(picture,CHARINDEX('.',picture) + 1,1)) collate SQL_Latin1_General_CP1_CS_AS 

enter image description here

1

一些正則表達式:

'[[:上:] [。] + $' - 只是大寫字母

'[。]。* [[:upper:]]' - 至少一個大寫字母

'[。]。* [[:lower:]]' - 至少一個小寫字母;並與前一起得到上,下等。

如果可能有兩個「。」。在文件名中,然後考慮使用 SUBSTRING_INDEX(picture,'。',-1) 來隔離'extension'。