我正在寻找一种在多个表上执行动态搜索的模式.
我无法控制遗留(和设计不佳)的数据库表结构.
考虑类似于简历搜索的场景,其中用户可能想要对简历中的任何数据执行搜索并且返回与其搜索标准匹配的简历列表.可以随时搜索任何字段并与一个或多个其他字段组合搜索.
实际的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子句.