自动创建包含多列的 SQL table
creating a SQL table with multiple columns automatically
我必须创建一个包含 90 多个字段的 SQL table,其中大多数是位字段,如 N01、N02、N03 ... N89、N90 是否有快速创建方法多个字段或者是否可以让一个字段包含一组值 true/false?我需要一个也可以方便查询的解决方案
没有简单的方法可以做到这一点,并且针对这样的 table 进行查询将非常具有挑战性。创建一个包含三列的 table - 项目编号、位字段编号和值字段。然后您将能够针对 table.
编写 'good' 简洁的 Tsql 查询
至少您可以为位域生成 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
TLDR:使用二进制算法。
对于这样的结构
==============
Table_Original
==============
Id | N01| N02 |...
我会推荐一个替代的 table 结构,像这样
==============
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)
您也可以在任何编程语言中轻松使用二进制算术。
使用三列。
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
.
您还可以对字段名(或字段名)的整个列进行 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/)
我必须创建一个包含 90 多个字段的 SQL table,其中大多数是位字段,如 N01、N02、N03 ... N89、N90 是否有快速创建方法多个字段或者是否可以让一个字段包含一组值 true/false?我需要一个也可以方便查询的解决方案
没有简单的方法可以做到这一点,并且针对这样的 table 进行查询将非常具有挑战性。创建一个包含三列的 table - 项目编号、位字段编号和值字段。然后您将能够针对 table.
编写 'good' 简洁的 Tsql 查询至少您可以为位域生成 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
TLDR:使用二进制算法。
对于这样的结构
==============
Table_Original
==============
Id | N01| N02 |...
我会推荐一个替代的 table 结构,像这样
==============
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)
您也可以在任何编程语言中轻松使用二进制算术。
使用三列。
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
.
您还可以对字段名(或字段名)的整个列进行 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/)