【问题标题】:Regex: How to identify column attributes from create table statement正则表达式:如何从创建表语句中识别列属性
【发布时间】:2018-10-11 11:59:30
【问题描述】:

我想将一些表创建语句从 Oracle 转换为 SQL Server。我采用的方法是使用正则表达式匹配来挑选重要的关键字。我似乎能够识别与列定义有关的语句部分,但我无法完全获得一个正则表达式模式来满足列规范的所有可能值。我感兴趣的属性是

  • 列名
  • 列类型
  • 类型参数(如果有)
  • 默认值(如果有)
  • Not Null(如果设置)

以下是 Oracle 中的一组列定义示例:

a1" NUMBER(10,0) CONSTRAINT "ca1" NOT NULL ENABLE, 
    "a2" NUMBER(10,0) CONSTRAINT "ca2" NOT NULL ENABLE, 
    "a3" NUMBER(14,0) DEFAULT 0 CONSTRAINT "ca3" NOT NULL ENABLE, 
    "a4" VARCHAR2(60 CHAR), 
    "a5" NUMBER(10,0), 
    "a6" NUMBER(10,0) DEFAULT 0 CONSTRAINT "ca6" NOT NULL ENABLE, 
    "a7" NUMBER(5,0) DEFAULT 0 CONSTRAINT "ca7" NOT NULL ENABLE, 
    "a8" NUMBER(5,0) DEFAULT 0 CONSTRAINT "ca8" NOT NULL ENABLE, 
    "abc" TIMESTAMP (6) DEFAULT SYSDATE NOT NULL ENABLE, 
    "def" CHAR(3 CHAR) NOT NULL ENABLE, 
    "ghi" CHAR(3 CHAR) NOT NULL ENABLE, 
    "XML" CLOB NOT NULL ENABLE, 
    "jkl" CHAR(6 CHAR), 
    "mno" NUMBER(*,0), 
    "pqr" NUMBER(*,0) DEFAULT (0) NOT NULL ENABLE, 

这是我目前的正则表达式模式

(?i)("?)(?<colname>\w+)("?)(\s+)(?<type>\w+)((?<typepars>\((\w|\s|\,)+\))?)(\s+default\s+(?<defaultval>(null|\w|\'\s\')+?))?(\s+constraint\s+\"?\w+\"?\s+(?<nullable>not\snull)\senable)?(,?)(\s*)(?-i)

我正在使用regex101 构建模式,我的目标环境是.Net。

我正在为我感兴趣的所有属性使用命名组。任何帮助将不胜感激。此外,我需要很多表格和列,因此我不能保证上述示例完全具有代表性。只有在我尝试为所有内容运行它时,我才会知道。

【问题讨论】:

标签: sql .net regex oracle


【解决方案1】:

我个人的建议是查询Postgres Catalog Tables,因为他们已经以方便的方式获得了相关信息。

以下正则表达式匹配(并在一定程度上构建)您拥有的 SQL 片段:

  (?i)^\s*("?)(?>(?<colname>\w+))\1
   \s+
   (?:(?<type>\b\w+\b)\s*(?:\((?<typepars>(?:\w|\s|\,|\*)+)\))?)
   \s*
   (\bdefault\s+(?<defaultval>(\(?)(null|\w+|\'\s\')+?\)?))?
   \s*
   (?:(?:\bconstraint\s+(")(?<constraint_name>\w+)\9\s+)?(?<nullable>not\s+null\b)\s+enable)?
   (,?)(\s*)(?-i)$

https://regex101.com/r/GHOIcS/2

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    相关资源
    最近更新 更多