【问题标题】:c# regular expression for Netezza data typec# Netezza 数据类型的正则表达式
【发布时间】:2012-10-18 03:29:41
【问题描述】:

我在工作中的一个大型项目的 SQL 模式迁移有点时间紧迫,并且从未在 C# 中使用过正则表达式。所以我正在寻找一个快速转身的希望。如何在 C# 中编写正则表达式,以便在字符串变量中找到这些值。如果拼出数字更容易/更快,那也没关系。我只是想确保它适用于括号内的所有数字。

CHARACTER VARYING(8000) ==> regex returns false because the length is <= 8000

CHARACTER VARYING(8001) ==> regex returns true because the length is > 8000

所以我的字符串是"CHARACTER VARYING({0})"

【问题讨论】:

  • 您是否要在"CHARACTER VARYING({0})" 类型行中查找所有{0},以使{0} 不仅仅是一个特定值?
  • 如果长度 ("{0}") 是 1 到 8000,我需要将整个字符串更改为 "varchar({0})"。而如果大于8000,则需要将整个字符串改为“varchar(MAX)”

标签: c# .net sql regex netezza


【解决方案1】:
public static string ReplaceLength(string s, int maxLength)
{
    return Regex.Replace(s, @"CHARACTER VARYING\((?<length>\d+)\)",
            match => "varchar(" + (
                                   int.Parse(match.Groups["length"].Value) <= maxLength ? 
                                        match.Groups["length"].Value : 
                                        "MAX"
                                  ) + 
                            ")");
}


测试用例

ReplaceLength("CHARACTER VARYING(8001)", 8000); // varchar(MAX)
ReplaceLength("CHARACTER VARYING(8000)", 8000); // varchar(8000)

【讨论】:

    【解决方案2】:

    您可以使用以下正则表达式获取数字。

    CHARACTER VARYING\((\d+)\) 并将其分组。您可以在 C# 中将其转换为 int 并进行比较。

    【讨论】:

      【解决方案3】:

      只是想补充一点,有一种更简单的方法可以从 netezza 获取此信息。

      select attname, datatype, attcolleng, name,  attlen, size, datatype, format_type, atttypid
      from _V_RELATION_COLUMN col_t
          cross join _v_datatype dat_t
      Where dat_t.objid = col_t.atttypid 
          and name='<table_name>'
          and size ='var'
      

      在结果集中,您应该引用 attcolleng 列,该列设置了您要查找的长度。

      【讨论】:

      • 这正是我为我构建的工具开发的。 "SELECT ATTNAME,FORMAT_TYPE,ATTLEN,ATTNOTNULL,ATTNUM FROM _v_relation_column WHERE NAME = " + tableName。有 4 种数据类型我必须使用此正则表达式逻辑:CHARACTER VARYING、CHARACTER、NATIONAL CHARACTER VARYING 和 NUMBERIC。可能还有其他的,但这些是我们系统中使用的数据类型
      • 为了让 T-SQL 列接受空值,我检查了 ATTNOTNULL 以确定 create table 命令的正确 DDL 元数据。
      • 所有优点。也就是说,如果您查看查询,它在 _v_datatype 上有一个附加连接,其中包含有关每列的附加数据。我也使用这个视图来返回列的长度和大小。如果您有兴趣,请运行查询并亲自查看。返回的字段集不需要额外的正则表达式工作。
      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      相关资源
      最近更新 更多