2014-01-27 2 views
3

У меня есть таблица SQL Server с 51 столбцов, как показано нижегде положение для поиска значений нескольких столбца в SQL Server

ID remarks1 Замечания2 . . . remarks50

мне нужно искать, если определенная строка присутствует в по крайней мере поле один замечания, как в примере ниже

id remarks1 remarks2 remarks3 remarks4 
1 key  nonkey  grabaze jjjjj 
2 uuu  888   8888  kkk 
3 888  key   hjhj  kjkj 

Предположим, что мне нужно искать key, который присутствует в любом remarks1,2,3 .. ... или 50

я могу иметь SQL как

select id from tbl where remarks1 ='key' or remarks2='key' and so on .. 

письмо или запрос Шифрование до 50 столбцов действительно unpractic al .. есть ли у нас быстрый метод?

+0

Это может помочь - http://social.msdn.microsoft.com/Forums/sqlserver/en-US/b8989cd2-9792-45eb-b6bf-cd998f141eea/how-to-check-multiple-column-for-single -значение – MusicLovingIndianGirl

+0

Это признак плохого дизайна стола.Это должна быть таблица с тремя столбцами: 'id',' 'и' remarks' и до 50 строк для каждого 'id', где' 'содержит числа от 1-50, которые в настоящее время встроены в ваш столбец имена. Поскольку кажется, что логически, 'remarks2' и' remarks45' следует относиться одинаково, то они должны фактически быть одним и тем же столбцом. –

ответ

1

Вы можете попробовать использовать приведенную ниже хранимую процедуру.

CREATE PROCEDURE sp_FindStringInTable @stringToFind VARCHAR(100), @schema sysname, @table sysname 
AS 

DECLARE @sqlCommand VARCHAR(8000) 
DECLARE @where VARCHAR(8000) 
DECLARE @columnName sysname 
DECLARE @cursor VARCHAR(8000) 

BEGIN TRY 
    SET @sqlCommand = 'SELECT * FROM [' + @schema + '].[' + @table + '] WHERE' 
    SET @where = '' 

    SET @cursor = 'DECLARE col_cursor CURSOR FOR SELECT COLUMN_NAME 
    FROM ' + DB_NAME() + '.INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = ''' + @schema + ''' 
    AND TABLE_NAME = ''' + @table + ''' 
    AND DATA_TYPE IN (''char'',''nchar'',''ntext'',''nvarchar'',''text'',''varchar'')' 

    EXEC (@cursor) 

    OPEN col_cursor  
    FETCH NEXT FROM col_cursor INTO @columnName  

    WHILE @@FETCH_STATUS = 0  
    BEGIN  
     IF @where <> '' 
      SET @where = @where + ' OR' 

     SET @where = @where + ' [' + @columnName + '] LIKE ''' + @stringToFind + '''' 
     FETCH NEXT FROM col_cursor INTO @columnName  
    END  

    CLOSE col_cursor  
    DEALLOCATE col_cursor 

    SET @sqlCommand = @sqlCommand + @where 
    --PRINT @sqlCommand 
    EXEC (@sqlCommand) 
END TRY 
BEGIN CATCH 
    PRINT 'There was an error. Check to make sure object exists.' 
    IF CURSOR_STATUS('variable', 'col_cursor') <> -3 
    BEGIN 
     CLOSE col_cursor  
     DEALLOCATE col_cursor 
    END 
END CATCH 

Хранимая процедура будет создаваться в основной базе данных, так что вы можете использовать его в любой из баз данных и принимает три параметра:

stringToFind - это строка, которую вы ищете. Это может быть простое значение как «тест», или вы также можете использовать групповой символ%, например «% test%», «% test» или «test%».

схема - это владелец схемы объекта

стол - это имя таблицы, вы хотите найти, то процедура будет искать все полукокса, NCHAR, NTEXT, NVARCHAR, текст и VARCHAR столбцы в таблице

Source

0

вы можете использовать unpivot транспонировать remarks* столбцов в виде строк с общим названием столбца, который затем можно фильтровать по. (Вам нужно будет повторить все 51 столбец). Distinct будет необходимо устранить случаи, когда более одного совпадения столбцов (т.е. имитирует оригинал or)

SELECT DISTINCT ID, Rmk 
    FROM 
    (SELECT ID, Remarks1, Remarks2, Remarks3, Remarks4 
    FROM Remarks) r 
    UNPIVOT 
     (Rmk FOR RmkCol IN (Remarks1, Remarks2, Remarks3, Remarks4))AS unpvt 
    WHERE rmk = 'key'; 

Sql Fiddle here

Однако я бы посоветовал вам пересмотреть нормализации это в 1 ко многому Remarks таблицы - если ваш стол большой, вам понадобится большое количество индексов на столбцах Remark*.

0

ВЫБОР примечания1, примечания2, примечания3, примечания4 от tabl_name ГДЕ СОДЕРЖИТ ((примечания1, примечания2, примечания3, примечания4), '888') ORDER BY id;

Смежные вопросы