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

标签 sql database-design design-patterns dynamic-sql table-structure

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

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

考虑一个类似于简历搜索的场景,其中用户可能希望对简历中的任何数据执行搜索,并获取符合其搜索条件的简历列表。任何字段都可以随时与一个或多个其他字段组合进行搜索。

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

是的,所以我已经开始了在代码中动态构建 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)

如果您不想搜索某些内容,只需传入一个空值即可。例如,为@name 传入“brian”,为@nick 传入null 会导致评估以下查询:
SELECT Name, Nickname
FROM Users
WHERE
    Name = 'brian' AND
    Nickname =  Nickname

合并运算符将 null 转换为身份评估,该评估始终为真,并且不会影响 where 子句。

关于sql - 动态搜索多个sql表的需要模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9687/

相关文章:

javascript - 如何管理应用程序和 URL 中的状态?

java - 空对象设计模式问题

mysql - 如何选择不同行的两个字段?

mysql - SQL 分隔大字段以加快查询速度

mysql - 修复 mysql 表中的重复条目

sql-server - 数据库中有多少个表/过程/函数太多?

mysql - 预约系统适合Amazon DynamoDB/NoSQL吗?

javascript - 了解基本js设计模式中的命令模式

mysql - 一个简单的 MYSQL View ,用于显示有关玩家及其监护人的信息

sql - 如何在 SQL Server 中多次检索行?