我需要选择以大写扩展名结尾的列。
例如,请看下表。
id - picture
1 - abc.JPG
2 - def.jpg
3 - 123.jpg
4 - xyz.JPG
结果应该给我第 1 行和第 4 行,因为 JPG 是大写的。
谁能帮忙?
我远非专家,但区分大小写以前让我感到困惑。你能修改你的表的结构吗?可能有帮助的一件事是按如下方式更改表的排序规则(此处为 SQLFiddle):
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:]+]$'
一些正则表达式:
'[.][[:upper:]]+$' - 只是大写字母
'[.].*[[:upper:]]' -- 至少一个大写字母
'[.].*[[:lower:]]' -- 至少一个小写字母;AND 与previous 一起得到上下等。
如果可以有两个“。” 在文件名中,然后考虑使用 SUBSTRING_INDEX(picture, '.', -1) 来隔离“扩展名”。
大多数 SQL 语言都有一个 UCASE 或 UPPER 函数来将文本转换为大写。我还利用了并非所有 SQL 方言中的 RIGHT 函数。如果您的 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