it-swarm.com.ru

Возможно ли, что я смог найти строку, содержащую строку? Предположим, что я не знаю, какие столбцы содержат строку

Я знаю, что есть несколько способов найти столбец строки, который содержит строку, например, использование [имя столбца] regexp '' или [имя столбца] как ''

в то время как в настоящее время мне нужна помощь, у меня есть таблица с несколькими столбцами, все они содержат varchar или текст, и я не уверен, какой столбец содержит определенную строку. Просто скажите, что я хочу найти "ххх из таблицы. Несколько разных столбцов могут содержать эту строку или нет. Есть ли способ, которым я мог бы найти, какой столбец содержит эту строку? 

У меня есть мышление, и решение может быть 

 select * from [table name] where [column1] regexp 'xxx' or 
    [column2] regexp 'xxx' or ...... [column39] regexp 'xxx' or .....
[colum60] regexp 'xxx' or ... or [column 80] regexp 'xxx';

Я не хочу такой запрос. Есть ли другой эффективный способ?

Чтобы привести лучший пример, скажем, что мы ищем таблицу, которая принадлежит блогу.

У нас есть заголовок, URL, контент, ключевые слова, теги, комментарии и так далее. Теперь мы просто говорим, что если какая-либо статья блога связана с «нормализацией базы данных», это слово может появиться в заголовке, URL-адресе или содержимом или где-либо еще, и я не хочу писать это по одному, например 

where title regexp 'database-normalization' or content regexp 'database-normalization' or url regexp 'database-normalization'......

например, когда есть сотни столбцов, мне нужно написать сотню, или в этом случае есть эффективный способ вместо того, чтобы написать сотню или утверждение? Например, использование if-else, коллекций или некоторых других для построения запроса.

8
spartaslave

Если вы хотите чистый динамический путь, вы можете попробовать это. Я давно пробовал это на sql-server и надеюсь, что это поможет вам.

#TMP_TABLE -- a temporary  table
- PK, IDENTITY
- TABLE_NAME
- COLUMN_NAME
- IS_EXIST


INSERT INTO #TMP_TABLE (TABLE_NAME,COLUMN_NAME)
SELECT C.TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.TABLE_NAME = <your-table> AND C.DATA_TYPE = 'varchar'; -- you can modify it to handle multiple table at once.

-- boundaries
SET @MINID = (SELECT ISNULL(MIN(<PK>),0) FROM #TMP_TABLE ); 
SET @MAXID = (SELECT ISNULL(MAX(<PK>),0) FROM #TMP_TABLE );

WHILE ((@MINID<[email protected]) AND (@MINID<>0))
BEGIN
    SELECT @TABLE_NAME = TABLE_NAME,@COLUMN_NAME =  COLUMN_NAME
    FROM  #TMP_TABLE 
    WHERE <PK> = @MINID;

    SET @sqlString =  ' UPDATE #TMP_TABLE 
                    SET IS_EXIST = 1 
                    WHERE EXIST (SELECT 1 FROM '+ @TABLE_NAME+' WHERE  '+ @COLUMN_NAME +' = ''demo.webstater.com'') AND <PK> = '+ @MINID;
    EXEC(@sql) ;
    SET @MINID = (SELECT MIN(<PK>) FROM #TMP_TABLE WHERE <PK> > @MINID );
END 

SELECT * FROM #TMP_TABLE WHERE IS_EXIST = 1 ; -- will give you matched results.
5
an33sh

Его вопрос не в том, чтобы запрашивать определенные столбцы с помощью предложения like. Он просил применить один и тот же шаблон к столбцам динамически .

Пример: Таблица с 3 столбцами - FirstName, LastName, Address и сопоставление с шаблоном «начинается с A», тогда результирующий запрос должен быть: Выбрать * из Customer, где FirstName как «A%» или LastName как «A» % "или Адрес как 'A%'

Если вы хотите построить запрос на бизнес-уровне, это легко сделать с помощью отражения вместе с EF.

Если у вас есть мотивация делать это в базе данных, то вы можете добиться этого путем динамического построения запроса, а затем выполнить его через sp_executesql. 

2
StartingFromScratch

Попробуйте это (просто передайте имя таблицы и строку для поиска) -:

create proc usp_findString 
@tablename varchar(500),
@string varchar(max)
as
Begin

Declare @sql2 varchar(max),@sql nvarchar(max)
SELECT @sql2=
STUFF((SELECT ', case when '+QUOTENAME(NAME)+'='''[email protected]+''' then 1 else 0 end as '+NAME
FROM (select a.name from sys.columns a join sys.tables b on a.[object_id]=b.[object_id] where [email protected]) T1
--WHERE T1.ID=T2.ID
FOR XML PATH('')),1,1,'')
--print @string
set @sql='select '[email protected]+' from '[email protected]
print @sql
EXEC sp_executesql @sql

End

SQL Server 2014

1
IShubh

Если вы знаете столбцы заранее, то, что вы предложили, возможно, самый эффективный способ (если немного многословно).

В противном случае вы можете получить имена столбцов из INFORMATION_SCHEMA.COLUMNS и создать динамический SQL на основе этого.

1
Branko Dimitrijevic

Одним из способов является использование CASE для проверки существования подстроки с помощью LOCATE в mysql и возврата столбца, но все, что вам нужно проверить в каждом столбце таблицы, как показано ниже:

CREATE TABLE test(col1 VARCHAR(1000), col2 VARCHAR(1000), col3 VARCHAR(1000))
INSERT INTO test VALUES
('while currently what I need some help is I have a table with 10 columns',
'contains a certain string. Just say that I want to search a table',
'contains a certain string demo.webstater.com')

SELECT (CASE WHEN LOCATE('demo.webstater.com', col1, 1) > 0 THEN 'col1'
        WHEN LOCATE('demo.webstater.com', col2, 1) > 0 THEN 'col2'
        WHEN LOCATE('demo.webstater.com', col3, 1) > 0 THEN 'col3'  
    END) whichColumn
FROM test

РЕЗУЛЬТАТ:

whichColumn
col3
0
Susang