Oracle - 选择字段包含小写字符的位置

时间:2008-11-25 14:45:53

标签: sql oracle select indexing case-sensitive

我在Oracle 9.2.0.6数据库中有一个表users。其中两个字段是varchar - last_name和first_name。

当行插入此表时,名字和姓氏字段应该全部为大写,但不知何故,这两个字段中的某些值是大小写混合。

我想运行一个查询,它会向我显示表中包含小写字符的名字或姓氏的所有行。

我在网上搜索并发现了REGEXP_LIKE,但这必须适用于较新版本的oracle - 它似乎对我没用。

我尝试的另一件事是将“abcde ... z”翻译为“$$$$$ ... $”,然后在我的字段中搜索“$”,但必须有更好的方法吗?

提前致谢!

6 个答案:

答案 0 :(得分:59)

这个怎么样:

select id, first, last from mytable
where first != upper(first) or last != upper(last);

答案 1 :(得分:1)

我认为BQ的SQL和Justin的第二个SQL会起作用,因为在这种情况下:

first_name        last_name
----------        ---------
bob               johnson
Bob               Johnson
BOB               JOHNSON

我希望我的查询返回前两行。

我只想确保这将是一个有效的查询 - 我的表中有5亿行。

当你说upper(first_name)!= first_name时,“first_name”是否始终与oracle正在查看的当前行有关?我一开始害怕使用这种方法,因为我担心我最终会把这个表连接到自己,但是他们都写了SQL,看起来等式检查只是逐行操作,会对我有用。

答案 2 :(得分:0)

如果您正在寻找Oracle 10g或更高版本,您可以使用以下示例。请考虑您需要找出列中任何字母为小写的行。

Column1
.......
MISS
miss
MiSS

在上面的示例中,如果您需要找到值missMiSS,那么您可以使用以下查询

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]');

答案 3 :(得分:-1)

 SELECT * 
 FROM mytable 
 WHERE FIRST_NAME IN (SELECT FIRST_NAME 
                      FROM MY_TABLE
                      MINUS 
                      SELECT UPPER(FIRST_NAME) 
                      FROM MY_TABLE )

答案 4 :(得分:-1)

试试这个:

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]','c'); => Miss, miss lower text
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[A-Z]','c'); => Miss, MISS upper text

答案 5 :(得分:-2)

对于SQL服务器,其中DB排序规则设置为不区分大小写,请使用以下命令:

SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))