我有可能找到一个包含字符串的行吗?假设我不知道哪些列包含字符串

spa*_*ave 8 mysql sql database select relational-database

我知道有几种方法可以找到哪一行的列包含字符串,例如使用[column name] regexp''或[column name] like''

虽然目前我需要一些帮助,但我有一个包含多个列的表,所有的都有varchar或text,我不确定哪个列包含某个字符串.只是说我想从表中搜索"xxx.几个不同的列可以包含这个字符串.有没有办法可以找到哪个列包含这个字符串?

我有一个想法,解决方案可能是

 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';
Run Code Online (Sandbox Code Playgroud)

我不希望这样的查询.还有另一种有效的方法吗?

为了给出一个更好的例子,假设我们正在搜索属于博客的表.

我们有标题,网址,内容,关键词,标签,评论等.现在我们只是说,如果任何博客文章与"数据库规范化"有关,这个词可能出现在标题,URL或内容中或任何地方,我不想一个一个地写出来

where title regexp 'database-normalization' or content regexp 'database-normalization' or url regexp 'database-normalization'......
Run Code Online (Sandbox Code Playgroud)

因为当有数百列时,我需要写一百,或者在这种情况下是否有一种有效的方式而不是写百或语句?就像使用if-else或集合或其他一些来构建查询一样.

an3*_*3sh 4

如果你想要一种纯粹的动态方式,你可以试试这个.我早就试过了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<=@MAXID) 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.
Run Code Online (Sandbox Code Playgroud)