【问题标题】:creating a SQL table with multiple columns automatically自动创建具有多列的 SQL 表
【发布时间】:2015-08-18 12:39:28
【问题描述】:

我必须创建一个包含 90 多个字段的 SQL 表,其中大多数是位字段,例如 N01、N02、N03 ... N89、N90 是否有一种快速创建多个字段的方法,或者是否可以有一个字段包含值数组真/假?我需要一个也可以轻松查询的解决方案。

【问题讨论】:

  • 在 dbms 世界中,它是列,而不是字段...
  • 具有多个同名的列,并附加数字,通常表示表格设计不佳。您应该考虑使用联结表。
  • 在 T-SQL 中,构建一个动态创建表的循环非常简单。考虑到所有字段的名称都像帖子中提供的那样。
  • 动态创建表通常也是设计有问题的标志,希望这是一次...
  • elnath78:表,就其本质而言,是一个数组。将 90 个字段组合成一个字段会产生比它解决的问题更多的问题,更不用说它专门否定了一个声明的对象(即“我需要一个也可以轻松查询的解决方案”)。当然,如果您分享项目的目标以及您计划如何使用此特定结构,以及您认为它有助于实现上述目标的原因,那将大有帮助。

标签: sql sql-server database-design ssms


【解决方案1】:

没有简单的方法可以做到这一点,对这样的表进行查询将非常具有挑战性。创建一个包含三列的表 - 项目编号、位字段编号和一个值字段。然后,您将能够针对该表编写“好”简洁的 Tsql 查询。

【讨论】:

  • 没有更多关于如何使用该表的信息,这是合适的解决方案。
【解决方案2】:

至少您可以为位域生成ALTER TABLE 脚本,然后运行这些脚本。

DECLARE @COUNTER INT = 1
WHILE @COUNTER < 10
BEGIN
    PRINT 'ALTER TABLE table_name ADD N' + RIGHT('00' + CONVERT(NVARCHAR(4), @COUNTER), 2) + ' bit'
    SET @COUNTER += 1
END

【讨论】:

    【解决方案3】:

    TLDR:使用二进制算术。

    对于这样的结构

    ==============
    Table_Original
    ==============
    Id | N01| N02 |...
    

    我会推荐一个像这样的替代表结构

    ==============
    Table_Alternate
    ==============
    Id | One_Col
    

    One_Col 属于varchar 类型,其值设置为

    cast(n01 as nvarchar(1)) + cast(n02 as nvarchar(1))+ cast(n03 as nvarchar(1)) as One_Col
    

    不过,我觉得您会使用 C# 或其他一些编程语言将值设置为列。您还可以使用位和位移位操作。

    当你需要获取一个值时,你可以使用 SQL 或 C# 语法(当作字符串处理) 在 sql 查询术语中,您可以使用类似

    的查询
    SELECT SUBSTRING(one_col,@pos,1) 
    

    @pos可以这样设置

    DECLARE @Colname nvarchar(4)
    SET @colname=N'N32'
     --    ....
    SET @pos= CAST(REPLACE(@colname,'N','') as INT)
    

    您也可以在任何编程语言中轻松使用二进制算术。

    【讨论】:

    • 在查询中使用子字符串不会影响记录很多的表的性能吗?表将有 25.000 多条记录。
    • @elnath78 如果您需要在编程语言中使用所有这些标志,我建议您将所有逻辑移至编程语言和数据库之外。仅使用 DB 作为单个 varchar(max) 列或 varbinary(max) 列进行存储
    • 根据我在最初帖子中的评论,我需要存储国家彩票的提取物,因此它有 11 个“类型”的 5 个值,并且我每周有 3 个排序,持续 15 年。我担心的是在我的查询中使用子字符串来查找给定的数字并查找提取它的所有类型。所以我应该使用位值来快速过滤和缩小多个数字的结果,而不使用子字符串。您能否确认查询中的子字符串不会在大表上减慢速度?我们正在谈论要搜索的 25.000 多条记录。
    • @elnath78 与使用SUBSTRING 获取列数据的SQL SELECT colname 相比会更慢。慢多少,取决于您的数据和索引。
    • @elnath78 查看这篇文章mssqltips.com/sqlservertip/1218/…
    【解决方案4】:

    使用三列。

    Table
    ID         NUMBER,
    FIELD_NAME VARCHAR2(10),
    VALUE      NUMBER(1)
    

    例子

    ID FIELD        VALUE
    1    N01        1
    1    N02        0
    .
    1    N90        1
    .
    2    N01        0
    2    N02        1
    .
    2    N90        1
    .
    

    您还可以为字段名(或字段名S)对整个列进行 OR:

    select DECODE(SUM(VALUE), 0, 0, 1) from table where field_name = 'N01';
    

    甚至执行 AND

    select EXP(SUM(LN(VALUE))) from table where field_name = 'N01';
    
    (see http://viralpatel.net/blogs/row-data-multiplication-in-oracle/)
    

    【讨论】:

      猜你喜欢
      • 2013-09-30
      • 1970-01-01
      • 2021-08-13
      • 2021-05-05
      • 1970-01-01
      • 2016-07-24
      • 2020-12-06
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多