需要模式来动态搜索多个sql表

我正在寻找一种在多个表上执行动态搜索的模式.

我无法控制遗留(和设计不佳)的数据库表结构.

考虑类似于简历搜索的场景,其中用户可能想要对简历中的任何数据执行搜索并且返回与其搜索标准匹配的简历列表.可以随时搜索任何字段并与一个或多个其他字段组合搜索.

实际的SQL查询是根据搜索的字段动态创建的.我发现的大多数解决方案都涉及复杂的块,但我不禁认为必须有一个更优雅的解决方案,因为这一定是一个解决的问题.

是的,所以我开始在代码中动态构建sql的道路.似乎很神奇.如果我真的试图支持所请求的能力来查询任何表中任何字段的任何组合,那么这将是一组大量的if语句.发抖

我相信我读到COALESCE仅在您的数据不包含NULL时才有效.那是对的吗?如果是这样,不要去,因为我到处都有NULL值.

解决方法

据我所知(我也是一个反对可怕的遗留数据库的人),没有动态WHERE子句这样的东西.它还没有解决.

就个人而言,我更喜欢在代码生成动态搜索.使测试更方便.请注意,在代码中创建SQL查询时,请勿在用户输入中进行连接.使用你的@variables!

唯一的选择是使用COALESCE运算符.假设你有下表:

Users
-----------
Name nvarchar(20)
Nickname nvarchar(10)

并且您希望可选地搜索名称或昵称.以下查询将执行此操作:

SELECT Name,Nickname
FROM Users
WHERE
    Name = COALESCE(@name,Name) AND
    Nickname =  COALESCE(@nick,Nickname)

如果您不想搜索某些内容,只需传入null.例如,为@name传递“brian”和为@nick传入null会导致以下查询被评估:

SELECT Name,Nickname
FROM Users
WHERE
    Name = 'brian' AND
    Nickname =  Nickname

coalesce运算符将null转换为标识评估,该标识始终为true且不影响where子句.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...