gpt4 book ai didi

oracle - 验证 Oracle 列名

转载 作者:行者123 更新时间:2023-12-01 09:46:15 30 4
gpt4 key购买 nike

在一种情况下,我们动态创建 sql 到 create动态临时表。 table_name 没有问题,因为它是由我们决定的,但是列名是由我们无法控制的来源提供的。

通常我们会使用以下查询检查列名:

select  ..
where NOT REGEXP_LIKE (Column_Name_String,'^([a-zA-Z])[a-zA-Z0-9_]*$')
OR Column_Name_String is NULL
OR Length(Column_Name_String) > 30

但是,是否有任何内置功能可以进行更广泛的检查。也欢迎对上述查询的任何输入。

提前致谢。

基于以下答案的最终查询:
select  ..
where NOT REGEXP_LIKE (Column_Name_String,'^([a-zA-Z])[a-zA-Z0-9_]{0,29}$')
OR Column_Name_String is NULL
OR Upper(Column_Name_String) in (select Upper(RESERVED_WORDS.Keyword) from V$RESERVED_WORDS RESERVED_WORDS)

特别不满意列名中像 $ 这样的字符,因此也不会使用..
dbms_assert.simple_sql_name('VALID_NAME')

相反,使用正则表达式,我可以决定允许使用自己的一组字符。

最佳答案

此答案不一定提供性能或逻辑改进,但您实际上可以使用单个正则表达式验证列名:

SELECT ...
WHERE NOT
REGEXP_LIKE (COALESCE(Column_Name_String, ''), '^([a-zA-Z])[a-zA-Z0-9_]{0,29}$')

这是有效的,因为:
  • 它使用相同的模式来匹配列,即以字母开头,然后仅使用字母数字字符和下划线
  • NULL列名映射到空字符串,这使正则表达式失败
  • 我们使用长度量词 {0,29}直接在正则表达式中检查列长度
  • 关于oracle - 验证 Oracle 列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48090367/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com