1

我需要选择以大写扩展名结尾的列。

例如,请看下表。

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

结果应该给我第 1 行和第 4 行,因为 JPG 是大写的。

谁能帮忙?

4

4 回答 4

3

我远非专家,但区分大小写以前让我感到困惑。你能修改你的表的结构吗?可能有帮助的一件事是按如下方式更改表的排序规则(此处为 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:]+]$'
于 2012-11-06T03:00:33.673 回答
1

一些正则表达式:

'[.][[:upper:]]+$' - 只是大写字母

'[.].*[[:upper:]]' -- 至少一个大写字母

'[.].*[[:lower:]]' -- 至少一个小写字母;AND 与previous 一起得到上下等。

如果可以有两个“。” 在文件名中,然后考虑使用 SUBSTRING_INDEX(picture, '.', -1) 来隔离“扩展名”。

于 2012-11-06T03:51:52.080 回答
0

大多数 SQL 语言都有一个 UCASE 或 UPPER 函数来将文本转换为大写。我还利用了并非所有 SQL 方言中的 RIGHT 函数。如果您的 SQL 没有 RIGHT 函数,您将不得不使用 SUBSTRING 和 LENGTH 来获得图片中正确的三个字符。

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

如果转换为大写的相同文本与未转换的文本相同,则它在数据库中为大写并且将被选中。

于 2012-11-06T03:22:13.307 回答
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

在此处输入图像描述

于 2012-11-06T03:25:50.607 回答