我需要sql server 2008的sql查询
我在一个表中有129列,下面是表结构 例: 我想从每个包含“R”或“O”的列中获取数据 我写不出疑问我需要sql server 2008的sql查询,sql,sql-server-2008,Sql,Sql Server 2008,我在一个表中有129列,下面是表结构 例: 我想从每个包含“R”或“O”的列中获取数据 我写不出疑问 select * from table where column 1 = 'R' or column 1 = 'O' or column 2 = 'R' or column 2 = 'O' ... 因为我有129列 请在这方面帮助我,我正在绞尽脑汁从两周内得到答案如果您使用SQL Server Management Studio编写查询,您可以从对象资源管理器拖放列,并使用“快速替换”修改语
select * from table
where column 1 = 'R' or column 1 = 'O' or column 2 = 'R' or column 2 = 'O' ...
因为我有129列
请在这方面帮助我,我正在绞尽脑汁从两周内得到答案如果您使用SQL Server Management Studio编写查询,您可以从对象资源管理器拖放列,并使用“快速替换”修改语句 编写查询的第一部分:
select *
from YourTable
where
将“列”节点从对象资源管理器拖到where子句后面的右侧,并在末尾添加一个额外的逗号
select *
from YourTable
where Document_Date, Document_Number, Thru_field, Book_Page,
按ctrl+f
并使用快速替换将、
替换为('R'、'O')或中的。注意:
中的前面有一个空格
select *
from YourTable
where Document_Date in ('R', 'O') or Document_Number in ('R', 'O') or Thru_field in ('R', 'O') or Book_Page in ('R', 'O') or
删除最后一个或,您就可以在不键入129列名称的情况下进行查询。如果您不想显式写入所有列,可以使用动态sql:
declare
@sql nvarchar(max),
@table_name nvarchar(256)
select @sql = '', @table_name = 'dbo.table_name' -- change to proper table name
SELECT @sql = @sql + 'or' + quotename(name) + 'in(''R'',''O'')'
FROM sys.columns WHERE object_id = object_id(@table_name)
select @sql = 'select * from ' + @table_name + ' where ' + stuff(@sql, 1, 2, '')
exec sp_executesql @sql
这解决了where
子句的生成问题。如果任何列的类型与varchar
/char
不同,则该操作失败。您可以阅读更多信息。这应该很有效:
with unpivoted as (
select id, val, col
from
(
select
id,
cast([Document_Date] as varchar(max)) as Document_Date,
cast([Document_Number] as varchar(max)) as Document_Number,
cast([Thru_field] as varchar(max)) as Thru_field,
cast([Book_Page] as varchar(max)) as Book_Page
from Table1
) baseTable
UNPIVOT
(val for col in (
[Document_Date], [Document_Number], [Thru_field], [Book_Page])) unpivot_table
)
select
*
from
table1
WHERE id in (
select distinct
up.id
from
unpivoted up
where
exists (
select
1
from
unpivoted up2
where
up2.id = up.id and
up2.val IN ('R', 'O')
)
)
基本上,我使用“unpivot”命令将庞大的列列表移动到行列表中。然后我搜索这些行以找到所需的值,最后,将它们合并以查找完整的原始数据集。为了使这变得容易,您可能需要创建一个与我的“unpivoted”CTE非常相似的视图,这样您就可以列出所有列
以下是查询的各个阶段:
- (unpivot的结果)
- (与您的条件匹配的基表的ID)
- (最后一项质询)
顺便说一句-我是sqlfiddle.com的作者如果表中也有大量行,那么在性能方面,您不可能找到非常令人满意的解决方案(因为列的数量和“或”要求)。如果可以将表重新建模为实体属性值模式(即使列正常化),那么查询和索引将更简单,性能将取决于“O”和“R”相对于其他可能值(NULL等)的选择性。您可以在EAV表上创建一个视图,为您提供与上面相同的128个“字段”。您能帮我解决这个问题吗?除了编写where column1='R'或column1='O'或column2='R'或column2='O'代码>等等。没有“神奇”的方法告诉SQL您想要什么-您需要明确地说明它。此设计似乎存在重大缺陷-不要期望SQL可以为您修复这些设计缺陷…所以。。。你已经为如何不必写129个列名苦苦挣扎了两周?你本可以花20分钟实际编写名称,而你本可以在2周前完成。我运行了查询,发现“,”附近的语法错误。@sql,我更改了代码,现在它生成位压缩查询。你可以试试这个,如果不行的话,我帮不了你,对不起。没用。我问我的经理,他让我用游标。现在只有你们需要帮忙了ME@sql请您再试一次,我已将@sql
类型更改为nvarchar(max)
-我的错误:-/。
with unpivoted as (
select id, val, col
from
(
select
id,
cast([Document_Date] as varchar(max)) as Document_Date,
cast([Document_Number] as varchar(max)) as Document_Number,
cast([Thru_field] as varchar(max)) as Thru_field,
cast([Book_Page] as varchar(max)) as Book_Page
from Table1
) baseTable
UNPIVOT
(val for col in (
[Document_Date], [Document_Number], [Thru_field], [Book_Page])) unpivot_table
)
select
*
from
table1
WHERE id in (
select distinct
up.id
from
unpivoted up
where
exists (
select
1
from
unpivoted up2
where
up2.id = up.id and
up2.val IN ('R', 'O')
)
)