我必须创建一个包含90多个字段的SQL表,其中大多数是位字段,如N01,N02,N03 ... N89,N90是否有创建多个文件的快速方法,或者是否可以有一个单独的字段字段包含值数组true / false?我需要一个也可以轻松查询的解决方案。
答案 0 :(得分:3)
没有简单的方法可以做到这一点,对这样的表进行查询将非常具有挑战性。创建一个包含三列的表 - 项目编号,位字段编号和值字段。然后,您将能够针对表格编写“好”简洁的Tsql查询。
答案 1 :(得分:1)
至少可以为位字段生成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
答案 2 :(得分:1)
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)
您也可以在任何编程语言中轻松使用二进制算法。
答案 3 :(得分:0)
使用三列。
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
.
您还可以对字段名称(或fieldnameS)执行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/)