Мне нужен SQL-запрос для SQL Server 2008 - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть 129 столбцов в таблице, и ниже приведена структура таблицы

EX:

Document_Date   Document_Number Thru_field  Book_Page
R                R                 X                 NULL
O                O                 O                   O
R                R                 X                 NULL

Я хочу получить данные из каждого столбца, который содержит 'R' или 'O'Я не могу написать запрос

select * from table 
where column 1 = 'R' or column 1 = 'O' or column 2 = 'R' or column 2 = 'O' ...

, потому что у меня 129 столбцов.

Пожалуйста, помогите мне, я изо всех сил пытаюсь получить ответ от 2 недель

Ответы [ 3 ]

0 голосов
/ 13 февраля 2012

Если вы не хотите явно писать все столбцы, вы можете использовать динамический 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.Вы можете узнать больше о sp_executesql на MSDN .

0 голосов
/ 13 февраля 2012

Это должно работать очень хорошо:

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", чтобы переместить ваш огромный список столбцов в список строк.Затем я просматриваю эти строки, чтобы найти нужные вам значения, и, наконец, присоединяюсь к ним, чтобы найти полный набор ваших исходных данных.Чтобы сделать это проще, вы, вероятно, захотите создать представление, очень похожее на мой «неотключенный» CTE, в котором вы можете перечислить все столбцы.

Вот запрос в его различныхэтапы:

Кстати - я автор sqlfiddle.com

0 голосов
/ 13 февраля 2012

Если вы используете SQL Server Management Studio для написания запроса, вы можете перетащить столбцы из Обозревателя объектов и использовать быструю замену для изменения вашего оператора.

Написать первую часть запроса:

select *
from YourTable
where 

Перетащите узел столбцов из Обозревателя объектов вправо после предложения where и добавьте одну дополнительную запятую в конце.

select *
from YourTable
where Document_Date, Document_Number, Thru_field, Book_Page,

Нажмите ctrl+f и используйте быструю замену, чтобы заменить , на in ('R', 'O') or. Примечание: перед in.

есть один пробел
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

Удалите последний or, и у вас есть запрос, не вводя 129 имен столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...