我需要選擇以大寫擴展名結尾的列。sql:在數據庫中選擇大寫字段
例如,請看下錶。
id - picture
1 - abc.JPG
2 - def.jpg
3 - 123.jpg
4 - xyz.JPG
結果應該給我行1和4,因爲JPG是大寫的。
任何人都可以幫忙嗎?
我需要選擇以大寫擴展名結尾的列。sql:在數據庫中選擇大寫字段
例如,請看下錶。
id - picture
1 - abc.JPG
2 - def.jpg
3 - 123.jpg
4 - xyz.JPG
結果應該給我行1和4,因爲JPG是大寫的。
任何人都可以幫忙嗎?
我遠離專家,但大小寫敏感已經掛斷了我。你能修改你的表格結構嗎?有一兩件事可以幫助正在改變表的排序規則如下(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:]+]$'
大多數SQL語言有UCASE或UPPER函數將文本轉換爲大寫。我還利用了RIGHT函數,這不是所有的SQL方言。如果你的SQL沒有RIGHT函數,你必須使用SUBSTRING和LENGTH來獲得正確的三個字符。
Select id, picture
from table
where UPPER(RIGHT(TRIM(picture),3)) = RIGHT(TRIM(picture),3)
如果轉換爲大寫相同的文字是相同的未轉化的文本,然後它在數據庫中大寫和將被選中。
,因爲它不能總是假定文件擴展名爲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
一些正則表達式:
'[[:上:] [。] + $' - 只是大寫字母
'[。]。* [[:upper:]]' - 至少一個大寫字母
'[。]。* [[:lower:]]' - 至少一個小寫字母;並與前一起得到上,下等。
如果可能有兩個「。」。在文件名中,然後考慮使用 SUBSTRING_INDEX(picture,'。',-1) 來隔離'extension'。
這將大體上工作,但我相信如果擴展名包含數字或特殊字符以及字母,它將失敗。實際上,我們需要更多地瞭解文件名的多樣性。他們全部是8.3還是你有像「grand.canyon.jpeg」這樣的難題?有可能編寫一個能夠完全按照你想要的方式返回的程序,但它可以非常容易地從簡單到非常複雜。 –
@BaconBits是的,沒錯。在這種情況下,我們可能可以調整爲更明確的正則表達式模式,是嗎?我現在不能測試,但是像'\。[A-Z0-9] + $'等等可能在這種情況下工作。可以肯定是錯了:) – RocketDonkey
謝謝@RocketDonkey更改表整理它爲我做的:) – apak