存储过程中的条件 WHERE 子句

2024-04-24

这个问题可能归结为更简单的问题,但我仍然很好奇 SQL Server / TSQL 能有多接近条件WHERE条款(以及为什么它们不存在背后的推理也很有趣)。

我有一个存储过程,对于一些参数,它接受一个枚举数组(它已相应地转换为用户定义的表类型,它本质上模拟了一个 int 数组)。作为参考,数据类型如下:

CREATE TYPE myIntArray AS TABLE (
    val INT
);

我的存储过程如下(修改为更简单):

CREATE PROCEDURE myProc
    @homeID INT,
    @name VARCHAR(500),
    @hometype_enum myIntArray READONLY,
    @country_enum myIntArray READONLY
AS
BEGIN
    SELECT * FROM my_table
    WHERE name=@name
END
GO

我想要做的是根据作为 INT 表传入的枚举数组的值来过滤查询结果,IFF 他们甚至有传入的值(表可能为空)。伪代码看起来像这样:

SELECT * 
FROM my_table
WHERE name = @name
IF((SELECT COUNT(val) FROM @hometype_enum) > 0)
BEGIN
    AND hometype IN (SELECT val FROM hometype_enum)
END
IF((SELECT COUNT(val) FROM @country_enum ) > 0)
BEGIN
    AND country IN (SELECT val FROM country_enum )
END

这两个枚举彼此独立,因此可以对没有枚举(两个表都为空)、非此即彼或两个枚举进行搜索和过滤。

我的实际查询涉及多个列、表和联合(丑陋,我知道),所以它不如仅仅能够复制/粘贴 3 行那么好SELECT对于每个场景。我目前正在使用一些相当丑陋的临时表逻辑,目前我将避免读者的注意。

除了弄清楚我的具体问题之外,我的主要问题是:SQL Server 是否支持条件WHERE子句陈述(根据我的研究,我确信它不是)?这是为什么(架构、时间复杂度、空间复杂度问题)?是否有任何或多或少简洁的方法来模拟条件子句,例如利用条件短路 https://stackoverflow.com/questions/6431472/how-to-dynamically-add-to-the-tsql-where-clause-in-a-stored-procedure?

感谢大家的见解。又是学习的一天!


正如评论中所建议的,处理这种条件 where 子句的最佳方法是使用动态 sql ..... 之类的东西......

CREATE PROCEDURE myProc
    @homeID INT,
    @name VARCHAR(500),
    @hometype_enum myIntArray READONLY,
    @country_enum myIntArray READONLY
AS
BEGIN
 SET NOCOUNT ON

 Declare @Sql NVarchar(MAX);

 SET @Sql = N' SELECT * FROM my_table '
          + N' WHERE name = @name '
           + CASE WHEN EXISTS (Select * FROM @hometype_enum)
             THEN N' AND hometype IN (SELECT val FROM hometype_enum) ' ELSE N' ' END
           + CASE WHEN EXISTS (Select * FROM @country_enum)
             THEN N' AND country IN (SELECT val FROM country_enum ) ' ELSE N' ' END

  Exec sp_executesql @Sql
                    ,N'@homeID INT , @name VARCHAR(500),
                      @hometype_enum myIntArray, @country_enum myIntArray'
                    ,@homeID
                    ,@name
                    ,@hometype_enum
                    ,@country_enum

END
GO

Using sp_executesql将允许 sql server 存储同一存储过程的参数化执行计划。它是针对同一存储过程的不同参数集/组合的不同执行计划,以获得最佳性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

存储过程中的条件 WHERE 子句 的相关文章

  • Oracle 中的 SQL 调优 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何文章 链接可以让我找到 SQL 调优 Oracle 的示例 如果能用例子来解释那就太好了 我需
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 如何在Oracle中使用Timestamp_to_scn和Scn_to_timestamp?

    我的查询结果是这样的 select cast to date a start time mm dd yyyy hh mi ss pm as timestamp date of call ora rowscn from calling tab
  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • 使用两个日期之间的随机日期时间更新每一行

    我有一个专栏叫date created我希望每一行保存一个随机日期 日期距当前时间为 2 天 我正在运行以下查询 但它会更新具有相同随机日期的所有行 我希望每一行都是随机的并且不相同 update table set date create
  • 如何将可视选择的文本通过管道传输到 UNIX 命令并将输出附加到 Vim 中的当前缓冲区

    使用 Vim 我尝试将在可视模式下选择的文本通过管道传输到 UNIX 命令 并将输出附加到当前文件的末尾 例如 假设我们有一个 SQL 命令 例如 SELECT FROM mytable 我想做如下的事情
  • 快速转储 SQL Server 表

    我在 SQL Server 2008 R2 中有一个大表 它包含数十亿行 我需要在我们的应用程序中加载整个数据集 查询全表非常慢 我想使用 bcp 将其转储到文件中并加载它 但问题是字符串列包含各种特殊字符 如 t 0 逗号和 n 我找不到
  • SQL服务器事务

    我需要了解sql server事务 我浏览了谷歌上的一些文章 但我什么也没理解 谁能帮我 您可以通过写入显式启动事务BEGIN TRANSACTION 您可以通过运行来结束事务COMMIT TRANSACTION 之前COMMIT运行时 受
  • 在 SQL Server 中处理日期

    我正在开发一个 ASP NET 网站 我从网页获取日期 然后根据用户输入我想从 SQL Server 数据库获取结果 使用存储过程 问题是我只能从用户界面获取这种格式的日期2016 10 08这是字符串类型 但在数据库中 我有一个类型为da
  • 如何在使用连接池时强制 SqlConnection 物理关闭?

    我明白 如果我实例化一个 SqlConnection 对象 我实际上是从连接池中获取一个连接 当我调用 Open 时 它将打开连接 如果我对该 SqlConnection 对象调用 Close 或 Dispose 方法 它将返回到连接池 但
  • 将 UUID 存储为 base64 字符串

    我一直在尝试使用 UUID 作为数据库键 我希望占用尽可能少的字节数 同时仍然保持 UUID 表示形式的可读性 我认为我已经使用 base64 将其减少到 22 个字节 并删除了一些尾随的 这些 对于我的目的来说似乎没有必要存储 这种方法有
  • 如何在 Visual Studio 中更改 Azure 数据库表的列顺序

    我整个下午都在寻找在 MS Visual Studio 2022 中重新排序 Azure 数据库表列的方法 没有运气 在其他应用程序中 可以通过拖动或剪切和粘贴轻松重新排列列 这里无能为力 此时 我什至不确定可以在 VS 中移动列 我只对
  • 避免连接失败时出现空指针

    我有我的域类 带有命名查询 class Atendimento implements Serializable Funcionario funcionario static mapping funcionario column FUNCOD
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 通过 Oracle 的数据库链接运行 SQL Server 存储过程

    参考如何通过数据库链接执行 Oracle 存储过程 https stackoverflow com questions 240788 how to execute an oracle stored procedure via a datab
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • Amazon RDS for SQL Server 是否支持 SSIS?

    从谷歌搜索中读到一些相互矛盾的答案 不确定答案是是 否还是可能 我觉得读的时候已经很清楚了this http docs aws amazon com AmazonRDS latest UserGuide CHAP SQLServer htm

随机推荐

  • ProgressDialog 未在 UIThread 中显示

    我正在使用 google api lib 创建地图 因为地图小部件需要很长时间才能加载 所以我尝试添加加载通知 但没有显示 不过 我可以在常规线程中显示进度对话框 为什么这个对话框没有显示 public void onCreate Bund
  • 是否可以扩展 woocommerce 产品休息端点?

    有没有办法扩展 woocommerce Rest api 中的产品对象 wp json wc v3 products 以非破坏性的方式 因此使用该端点的插件不会中断 我目前尝试创建自己的休息端点来复制该对象 但现在缺少大量数据 我也尝试过类
  • 如何使用 Amazon API 轻松恢复购买?

    我正在尝试像 iOS 一样恢复购买 但我不知道如何使用 Amazon API 轻松恢复 IAP 权利购买 如果我向PurchasingManager 它返回一个PurchaseResponse 但是那个PurchaseResponse如果已
  • ar.js 中的事件监听器

    我正在开发一个涉及 ar js 的项目 该项目显示 3D 对象和文本 以在移动设备和笔记本电脑上教孩子们字母表 我试图添加一个事件侦听器作为额外的内容 以使孩子们进行更多互动 我的目标是单击 触摸显示的模型 它将放大或改变颜色或旋转 附件中
  • 如何在 django 模型字段上存储多个值

    我有一个模型 将重复的训练存储在我的健身房中 DAYS OF WEEK 0 Monday 1 Tuesday 2 Wednesday 3 Thursday 4 Friday 5 Saturday 6 Sunday class Recurri
  • 如何使用Python图像库(PIL)突出显示图像的一部分?

    如何突出显示图像的一部分 位置定义为 4 个数字的元组 你可以想象它就像我有电脑主板的图像 我需要突出显示例如CPU插槽所在的部分 请注意 对于 Python 3 您需要使用pillow https pypi org project Pil
  • 反转唯一的通用外键(并返回一个对象而不是相关管理器)

    我有一个具有独特通用外键关系的模型 class Contact models Model content type models ForeignKey ContentType object id models PositiveInteger
  • Discord.js 中的用户和 GuildMember 有什么区别?

    我的代码中出现了很多错误 我认为这些错误是由于两者之间的混淆造成的GuildMembers and Users 有人可以解释其中的区别吗 const user message mentions users first TypeError u
  • 解释 proxy.config.json 特性 Angular 5

    api target https localhost 8000 api secure false logLevel debug pathRewrite api changeOrigin true 请提供此代码片段中每个功能的详细使用 谢谢你
  • 是否使用 PHP 框架? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经开始用 PHP 编写一些应用程序 并且我对这门语言越来越熟悉 有人告诉我有关 CakePHP 和 CodeIgniter 的信息 我想更好
  • 将 pandas 数据框中的数字和字母字符串转换为 int/float

    我觉得必须有一个快速的解决方案来解决我的问题 我使用多个列表理解破解了一个实施不佳的解决方案 这无论如何都不理想 也许有人可以在这里帮忙 我有一组字符串值 例如 3 2B 1 5M 1 1T 其中最后一个字符自然表示百万 十亿 万亿 该集合
  • Ecto - 验证关联模型的存在

    如何验证 Ecto 中是否存在关联模型 schema foo do has many bar Bar timestamps end required fields w bar invalid 有办法这样做吗 并验证这些字段的最小 最大数量
  • Pandas:无法导入名称邻接

    来自韦斯 def side by side objs kwds from pandas core common import adjoin space kwds get space 4 reprs repr obj split n for
  • 通过引用传递变量并构造新对象

    你好 我有像下面这样的代码 但我不知道为什么它不起作用 class Clazz2 class Clazz public void smth Clazz2 c void smth2 const Clazz2 c class Clazz2 in
  • 升级到 webpack 4 后,Angular 应用程序中的 InjectionToken 配置没有

    我最近从 Webpack 2 升级到 4 Webpack 可以编译 并且大多数应用程序都可以正常工作 看来应用程序的一部分已损坏 我收到错误 NullInjectorError No provider for InjectionToken
  • 为什么 getView 在分离列表适配器上返回错误的 ConvertView 对象?

    我根据自己的需要改编了 Jeff Sharkey 的分离列表适配器 SeparatedListAdapter 得到了如下结果 public class SeparatedListAdapter
  • 如何在CSS中使div背景颜色透明

    我没有使用CSS3 所以我不能使用opacity or filter属性 如果不使用这些属性 我怎样才能使background color透明的一个div 它应该是这样的文本框示例link http www w3schools com cs
  • 在 Django 中创建员工用户

    我正在尝试在 Django 中创建一个员工用户 UserModel objects create user username A email email protected cdn cgi l email protection passwo
  • Android appcompat-v7:21.0.0 更改材质复选框颜色

    我已经更新了我的项目以使用最新的 appcompat 支持库 新版本使用材料设计复选框和单选按钮 我的应用程序是深色主题 复选框是黑色的 很难看到 我正在尝试根据以下内容更改它们的颜色保持兼容性 https developer androi
  • 存储过程中的条件 WHERE 子句

    这个问题可能归结为更简单的问题 但我仍然很好奇 SQL Server TSQL 能有多接近条件WHERE条款 以及为什么它们不存在背后的推理也很有趣 我有一个存储过程 对于一些参数 它接受一个枚举数组 它已相应地转换为用户定义的表类型 它本