有没有可能我发现一行包含一个字符串?假设我不知道哪些列包含字符串

kyvafyod  于 2021-06-20  发布在  Mysql
关注(0)|答案(6)|浏览(227)

我知道有几种方法可以找到哪一行的列包含字符串,比如使用[column name]regexp“”或像“”这样的[column name]
虽然目前我需要一些帮助是我有一个有几个列的表,所有的都有varchar或text,我不确定哪一列包含某个字符串。就说我想从表中搜索一个“”。几个不同的列可能包含或不包含此字符串。有没有办法找到哪个列包含这个字符串?
我有一个想法,解决办法可能是

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或内容或任何地方,我不想像这样一个一个地写

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

当有几百列时,我需要写一百列,或者在这种情况下,有没有一种有效的方法来代替写一百列或语句?比如使用if-else或collections或其他一些方法来构建查询。

pnwntuvh

pnwntuvh1#

如果你事先知道这些列,你的建议可能是最有效的方法(如果有点冗长的话)。
否则,您可以从information\u schema.columns获取列名,并在此基础上构造动态sql。

q1qsirdb

q1qsirdb2#

尝试以下操作(只需传递tablename和要查找的字符串)—:

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)+'='''+@string+''' 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 b.name=@tablename) T1
--WHERE T1.ID=T2.ID
FOR XML PATH('')),1,1,'')
--print @string
set @sql='select '+@sql2+' from '+@tablename
print @sql
EXEC sp_executesql @sql

End

sql server 2014版

jfgube3f

jfgube3f3#

如果你想要一个纯动态的方式,你可以试试这个。我早就试过了 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.
djmepvbi

djmepvbi4#

他的问题不是用like子句查询特定的列。他一直要求在列之间动态应用相同的模式。
示例:包含3列的表-firstname、lastname、address和pattern matching为“start with a”,则生成的查询应为:select*from customer where firstname like“a%”或lastname like“a%”或address like“a%”
如果您想在业务层中构建查询,可以很容易地通过反射和ef来实现。
如果您有动机在数据库中这样做,那么您可以通过动态构建查询,然后通过sp\u executesql执行来实现。

7qhs6swi

7qhs6swi5#

一种方法是使用 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
i7uq4tfw

i7uq4tfw6#

你可以用很多方法来进行分析。如果“like a%%”是从sql中的“regex”库开始的,则可以使用“like a%%”进行多次检查。

相关问题