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
在上面的例子中,如果你需要找到值miss
和MiSS
,那么你可以使用下面的查询
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 - 选择字段具有小写字符的位置的主要内容,如果未能解决你的问题,请参考以下文章