我需要选择以大写扩展名结尾的列。
例如,请查看下表。id - picture
1 - abc.JPG
2 - def.jpg
3 - 123.jpg
4 - xyz.JPG
结果应该给我第1行和第4行,因为JPG是大写的。
任何人都可以帮忙吗?
答案 0 :(得分: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
),然后更改排序规则以支持不区分大小写的比较({ {3}}):
SELECT *
FROM pics
WHERE CAST(picture AS CHAR CHARACTER SET latin1)
COLLATE latin1_general_cs REGEXP '\.[[:upper:]+]$'
答案 1 :(得分:1)
一些REGEXP:
'[。] [[:upper:]] + $' - 只是大写字母
'[。]。* [[:upper:]]' - 至少一个大写字母
'[。]。* [[:lower:]]' - 至少一个小写字母;和以前一起得到上下等等。
如果可能有两个“。”在文件名中,然后考虑使用 SUBSTRING_INDEX(图片,'。', - 1) 隔离'扩展'。
答案 2 :(得分: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)
如果转换为大写的相同文本与未转换的文本相同,则它在数据库中为大写,并将被选中。
答案 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