我知道有几种方法可以找到哪一行的列包含字符串,比如使用[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或其他一些方法来构建查询。
6条答案
按热度按时间pnwntuvh1#
如果你事先知道这些列,你的建议可能是最有效的方法(如果有点冗长的话)。
否则,您可以从information\u schema.columns获取列名,并在此基础上构造动态sql。
q1qsirdb2#
尝试以下操作(只需传递tablename和要查找的字符串)—:
sql server 2014版
jfgube3f3#
如果你想要一个纯动态的方式,你可以试试这个。我早就试过了
sql-server
希望能对你有所帮助。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执行来实现。
7qhs6swi5#
一种方法是使用
CASE
检查子串是否存在LOCATE
在mysql中,返回列,但只需检查表中的每一列,如下所示:输出:
i7uq4tfw6#
你可以用很多方法来进行分析。如果“like a%%”是从sql中的“regex”库开始的,则可以使用“like a%%”进行多次检查。