Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要sql server 2008的sql查询_Sql_Sql Server 2008 - Fatal编程技术网

我需要sql server 2008的sql查询

我需要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编写查询,您可以从对象资源管理器拖放列,并使用“快速替换”修改语

我在一个表中有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 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')
    )
)