Oracle - 选择字段具有小写字符的位置

Posted

技术标签:

【中文标题】Oracle - 选择字段具有小写字符的位置【英文标题】:Oracle - Select where field has lowercase characters 【发布时间】:2010-09-23 23:20:45 【问题描述】:

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

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

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

我在网上搜索并找到了 REGEXP_LIKE,但这肯定是针对较新版本的 oracle - 它似乎不适合我。

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

提前致谢!

【问题讨论】:

【参考方案1】:

这个怎么样:

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

【讨论】:

【参考方案2】:

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

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

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

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

当您说upper(first_name) != first_name 时,“first_name”是否总是与oracle 正在查看的当前行相关?起初我害怕使用这种方法,因为我担心我最终会将这个表加入到自身中,但是你们俩编写 SQL 的方式似乎只是在逐行的基础上进行相等性检查,这对我有用。

【讨论】:

条件逐行应用。当然,您的查询必须对 5 亿行表进行全表扫描才能处理查询,这会很慢。如果这种情况经常发生,那么基于函数的索引可能会有所帮助。 很好,贾斯汀。我也打算添加基于函数的索引建议。另外,如果数据真的应该是大写的,你可以创建一个触发器来强制插入。 Brian,不确定您打算做什么,但请注意,您也可以运行“update mytable set first_name=upper(first_name) and last_name=upper(last_name);”规范化你的所有数据...你不需要逐行获取它并在数据库之外更新它。 谢谢!这两列都被索引了,所以对它们的查询非常快,但我还必须研究一个函数索引。它不会经常发生,我只需要它进行分析,直到我们修复它。 对于普通索引,只有在针对存储在索引中的特定大小写执行查询时,查询才应该很快。有关功能索引的更多信息,请参阅我在 ***.com/questions/291166/… 的评论。【参考方案3】:

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

Column1
.......
MISS
miss
MiSS

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

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

【讨论】:

嗯,我想知道为什么这在 12c 上对我不起作用。该查询返回所有三行。数据库 NLS 设置会不会有影响?【参考方案4】:
 SELECT * 
 FROM mytable 
 WHERE FIRST_NAME IN (SELECT FIRST_NAME 
                      FROM MY_TABLE
                      MINUS 
                      SELECT UPPER(FIRST_NAME) 
                      FROM MY_TABLE )

【讨论】:

这没有找到last_name的大小写错误,并且三击表。为什么会比公认的答案更好?【参考方案5】:

试试这个:

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

【讨论】:

考虑扩展您的答案。请解释一下这段代码是如何解决问题的。【参考方案6】:

对于数据库排序规则设置不区分大小写的 SQL Server,请使用以下命令:

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

【讨论】:

以上是关于Oracle - 选择字段具有小写字符的位置的主要内容,如果未能解决你的问题,请参考以下文章

Oracle多关键字查询

Oracle学习标量函数

MySQL 选择 JSON 字段属性具有值的位置

Django为特定外键选择具有重复字段值的行

oracle字段能大小写混写吗

oracle字段怎么大写变小写,小写变大写