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或集合或其他一些来构建查询一样.
如果你想要一种纯粹的动态方式,你可以试试这个.我早就试过了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)
归档时间: |
|
查看次数: |
397 次 |
最近记录: |