分割给定字符串并准备 case 语句

2023-11-21

Table: 表名

create table table_name
(
given_dates timestamp,
set_name varchar
);

插入记录:

insert into table_name values('2001-01-01'),('2001-01-05'),('2001-01-10'),
                 ('2001-01-15'),('2001-01-20'),('2001-01-25'),
                 ('2001-02-01'),('2001-02-05'),('2001-02-10'),
                 ('2001-02-15');

现在我想更新某些日期的 set_name 。

例如:

我想像这样更新表:

given_dates    set_name 
----------------------
2001-01-01      s1
2001-01-05      s1
2001-01-10      s2
2001-01-15      s2
2001-01-20
2001-01-25
2001-02-01
2001-02-05
2001-02-10
2001-02-15

Note: The given_dates and set_name由于它们是动态的,因此会传递参数。我可能会通过2组 如上图s1,s2或根据要求可通过4组。

所以我需要动态 case 语句来更新set_name.

给定两个参数:

declare p_dates varchar := '2001-01-01to2001-01-05,2001-01-10to2001-01-15';

declare p_sets varchar := 's1,s2';

我可以通过使用以下静态脚本来做到这一点:

静态更新语句:

update table_name
SET set_name = 
CASE  
when given_dates between '2001-01-01' and '2001-01-05' then 's1'
when given_dates between '2001-01-10' and '2001-01-15' then 's2'
else '' 
end;

上面的更新语句完成了静态工作。

就像更新表一样,我只想准备 case 语句,该语句应该是动态的,可以根据参数进行更改(p_dates,p_sets)变化。

问题:

  1. 如何分割给定的日期p_dates? (我有to两个日期之间的关键字。)
  2. 如何分割给定的集合p_sets? (我在两个 set_name 之间有“,”逗号。)
  3. 拆分后如何准备动态 case 语句p_dates and p_sets?

这个问题涉及到使用 SQL Server 2008 R2 的动态 case 语句,这对于 Microsoft SQL Server 来说是一样的。


干净的设置:

CREATE TABLE tbl (
  given_date date
, set_name varchar
);

使用单数术语作为列名称single value.
数据类型很明显date而不是一个timestamp.

要将文本参数转换为有用的表格:

SELECT unnest(string_to_array('2001-01-01to2001-01-05,2001-01-10to2001-01-15', ',')) AS date_range
     , unnest(string_to_array('s1,s2', ',')) AS set_name;

“并行解除嵌套”很方便,但也有其注意事项。 Postgres9.4添加了一个干净的解决方案,Postgres10最终净化了这种行为。见下文。

动态执行

准备好的声明

准备好的语句仅对创建会话可见,并随之消失。根据文档:

准备好的语句仅在当前数据库会话期间持续。

PREPARE 每次会话一次:

PREPARE upd_tbl AS
UPDATE tbl t
SET    set_name = s.set_name
FROM  (
   SELECT unnest(string_to_array($1, ',')) AS date_range
        , unnest(string_to_array($2, ',')) AS set_name
   ) s
WHERE t.given_date BETWEEN split_part(date_range, 'to', 1)::date
                       AND split_part(date_range, 'to', 2)::date;

或者使用客户提供的工具来准备声明。
使用任意参数执行n次:

EXECUTE upd_tbl('2001-01-01to2001-01-05,2001-01-10to2001-01-15', 's1,s4');

服务器端功能

函数被持久化并且可见all会议。

CREATE FUNCTION once:

CREATE OR REPLACE FUNCTION f_upd_tbl(_date_ranges text, _names text)
  RETURNS void AS
$func$
UPDATE tbl t
SET    set_name = s.set_name
FROM  (
   SELECT unnest(string_to_array($1, ',')) AS date_range
        , unnest(string_to_array($2, ',')) AS set_name
   ) s
WHERE  t.given_date BETWEEN split_part(date_range, 'to', 1)::date
                        AND split_part(date_range, 'to', 2)::date
$func$  LANGUAGE sql;

调用n次:

SELECT f_upd_tbl('2001-01-01to2001-01-05,2001-01-20to2001-01-25', 's2,s5');

SQL小提琴

卓越的设计

使用数组参数(仍然可以作为字符串文字提供),daterange类型(均第 9.3 页)和新平行unnest() (pg 9.4).

CREATE OR REPLACE FUNCTION f_upd_tbl(_dr daterange[], _n text[])
  RETURNS void AS
$func$
UPDATE tbl t
SET    set_name = s.set_name
FROM   unnest($1, $2) s(date_range, set_name)
WHERE  t.given_date <@ s.date_range
$func$  LANGUAGE sql;

<@是“元素包含于”运算符。

Call:

SELECT f_upd_tbl('{"[2001-01-01,2001-01-05]"
                  ,"[2001-01-20,2001-01-25]"}', '{s2,s5}');

Details:

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

分割给定字符串并准备 case 语句 的相关文章

  • SQL Server PIVOT 函数

    我有一个检索所有代理及其模块的查询 结果集将每个模块返回 1 行 SELECT am agentID AS agentid pa agentDisplayName agentdisplayname m ModuleName ModuleNa
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • SQL Server 使用通配符加入并在第一个匹配处停止

    IF OBJECT ID tempdb TABLE1 IS NOT NULL DROP TABLE TABLE1 IF OBJECT ID tempdb TABLE2 IS NOT NULL DROP TABLE TABLE2 CREATE
  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • Rails csv 格式的原始查询,通过控制器返回

    我使用 Active Record 来获取我的故事 然后生成 CSV 这是在 Rails Cast 中完成的标准方法 但我有很多行 需要几分钟 我想如果我能让 posgresql 来做 csv 渲染 那么我可以节省一些时间 这是我现在所拥有
  • 在 Postgres 中的数组字段上应用聚合函数?

    是否可以对整数 字段 或其他数字数组 中的所有值应用聚合 如 avg stddev CREATE TABLE widget measurement integer insert into widget measurement values
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • 如何避免应用程序停止后 docker 容器停止

    有一个带有 Postgres 服务器的 docker 容器 postgres 停止或崩溃 无关紧要 我需要检查一些环境变量和一些文件的状态 默认情况下 容器在应用程序完成后停止 我知道有一个选项可以更改 dockerfile 中的默认行为
  • 多租户 Rails 应用:不同技术的优缺点是什么?

    我最初是为一位客户编写 Ruby on Rails 应用程序的 现在 我正在更改它 以便它可以用于不同的客户 我的最终目标是某些用户 不是我 可以单击按钮并创建一个新项目 然后生成所有必要的更改 新架构 新表 代码处理 无需任何人需要我编辑
  • 对具有许多索引的表进行缓慢的批量插入

    我尝试将数百万条记录插入到具有 20 多个索引的表中 在上次运行中 每 100 000 行花费了 4 个多小时 并且查询在 3 5 天后被取消 您对如何加快速度有什么建议吗 我怀疑是索引太多的原因 如果你也这么认为 如何在操作前自动删除索引
  • MySQL 中的 UDF 性能

    我注意到 当查询在 SELECT 或 WHERE 子句中调用 UDF 时 MySQL 查询执行时间的性能会呈指数级下降 有问题的 UDF 查询本地表以返回标量值 因此它们不仅执行算术表达式 而且充当相关子查询 我通过简单地删除 UDF 并使
  • 使用 xmlagg 时出现子查询错误和太多值

    我在连接许多大型表中的所有数据时遇到问题 我昨天对此提出了问题 但不幸的是 listagg 似乎不是一个好的选择 链接子查询返回多行 https stackoverflow com questions 54651144 subquery r
  • 使用 Powershell SQL 将数据提取到 Excel

    我想使用 powershell 将数据从 SQL Server 提取到新的 excel 文件 对于小型数据集 我的代码可以工作 但某些表的行数超过 100 000 行 这将需要很长时间 我不在 SQl 服务器中使用该实用程序的原因是因为我想
  • ActiveRecord 嵌套 SELECT——我可以在没有手动 SQL 的情况下完成它吗?

    我有一张桌子 上面有 除其他外 一个名字和一个等级 我想返回所有唯一名称的集合 但对于返回的每个名称 我想选择排名最高的行 这很简单 有两个嵌套的 SELECT 语句 SELECT FROM SELECT FROM foo ORDER BY
  • 部署 dacpac 所需的权限

    我正在尝试使用 sqlpackage exe 在租户上部署 dacpac 目前 我正在向将部署此功能的帐户授予 SysAdmin 或 db owner 权限 并且它工作正常 但在生产中 如果目标租户数据库属于其他应用程序 我可能无法获得这些
  • 多级排序

    我有一个表 其中包含一些记录 其中包含名称 评级等字段 我首先想要根据评级将结果限制为 20 进行排序 然后在此结果集上想要进一步应用基于名称的排序 我知道要排序我们需要使用像这样的查询 Select from table order by
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 使用nodejs的sequelize更新多对多连接表

    我有一个产品表和一个类别表 一个产品可以有多个类别 一个类别可以有多个产品 因此我有一个 ProductsCategories 表来处理多对多连接 在下面的示例中 我尝试将我的一款产品 ID 为 1 与 3 个不同的类别 ID 为 1 2
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • 通过单击并拖动来“检查”多个复选框?

    我有一个充满复选框的表格 如下所示 我希望能够按住鼠标并拖动以激活多个复选框 我不知道从哪里开始 我寻找答案 但只找到了另一个线程有人询问如何做 但没有答案 HTML table tbody tr td td tr tbody table
  • 在 JavaFX 2.2 桌面应用程序中嵌入 Google 地图会引发异常并且通常无法执行

    我有一个项目需要在桌面java应用程序中嵌入谷歌地图 经过一番研究后 我发现 Java FX 确实提供了此功能 并继续编写了一个示例应用程序作为 PoC 应用程序运行正常 一切都很好 升级到新的 7u7 java 版本后 我的代码不再像以前
  • 应用程序第一次升级 sqlite 数据库时崩溃

    当第一次更新 sqlite 数据库时 我的应用程序遇到崩溃 重新加载应用程序 从此一切正常 我猜这与 onUpgrade 函数有关 我似乎无法找到问题出在哪里 非常感谢任何建议 提前致谢 数据库助手 public class Databas
  • 如何在 C# 中处理 JSON?

    是否有一个简单 优雅的解析器来处理 C 中的 JSON 实际序列化 反序列化为 C 对象怎么样 JSON Net是一个相当不错的图书馆
  • 如何根据 pandas python 中的特定列合并两个数据框?

    我必须合并两个数据框 df1 company standard tata A1 cts A2 dell A3 df2 company return tata 71 dell 78 cts 27 hcl 23 我必须将两个数据帧统一为一个数据
  • 在对等方关闭的 TCP 套接字上写入

    我有一个客户端 服务器应用程序 其中每一端都通过 TCP 套接字与另一端进行通信 我正确地建立了连接 然后在客户端将任何数据写入套接字之前使服务器崩溃 我看到的是第一个write 尝试 客户端 成功 它返回实际写入的字节数 而以下返回 如我
  • 如何为所有派生类型部分特化类模板?

    我想部分专门化一个我无法更改的现有模板 std tr1 hash 对于基类和所有派生类 原因是我使用了奇怪的重复模板模式来实现多态性 并且哈希函数是在 CRTP 基类中实现的 如果我只想部分专门化 CRTP 基类 那么很简单 我可以编写 n
  • 在多个集合上执行事务时,MongoDB Atlas 出错(代码 8000)

    我正在尝试从 Mongo DB Node JS 驱动程序在 Mongodb Atlas M0 实例上执行事务 如所述here 并且我收到以下错误 code 8000 codeName AtlasError errmsg internal a
  • OpenCV Python:绘制 minAreaRect (旋转矩形未实现)

    是否有任何辅助方法来绘制由返回的旋转矩形cv2 minAreaRect 大概是作为 x1 y1 x2 y2 angle cv2 矩形 不支持角度 由于返回的元组不是 RotatedRect 类 因为它似乎没有在 Python 绑定中实现 所
  • 添加多个 ClusterManager 到 Google 地图

    我正在尝试为 Google Map 使用两个 ClusterManager 但我只能添加一个 clustermanager 及其项目单击事件 googleMap setOnMarkerClickListener mClusterManage
  • TChan 写入是否已集成到 Haskell STM 中?

    如果 STM 事务失败并重试 是否会调用writeTChan重新执行 以便最终得到两次写入 或者 STM 仅在事务提交时才实际执行写入 即 这个针对睡觉理发师问题的解决方案是否有效 或者如果交易在enterShop第一次失败 import
  • 使用 CSS 浮动 DIV 之间的垂直边框

    我有以下 HTML 结构 div div Some text goes here div div Different text goes here div div class clear div div 我还有以下 CSS parent w
  • VB.Net 变量声明:键入还是不键入?

    在 VB Net 中 声明字符串的常用方法是 Dim helloWorld As String Hello World 但是 您也可以使用动态变量 例如 Dim helloWorld Hello World 两者最终都会是同一件事 但最佳实
  • 我的随机梯度下降实现正确吗?

    我正在尝试开发随机梯度下降 但我不知道它是否100 正确 我的随机梯度下降算法生成的成本有时与 FMINUC 或批量梯度下降生成的成本相差甚远 虽然当我将学习率 alpha 设置为 0 2 时 批量梯度下降成本会收敛 但我被迫将学习率 al
  • 循环phpmailer

    当我发送电子邮件时 我收到两封电子邮件 但它应该将电子邮件发送到各自的电子邮件 乱跳问题 array values Array 0 gt Array 0 gt uname1 1 gt fullname1 2 gt email 1 1 gt
  • 运行时获取DLL路径

    我想得到一个dll s其代码中的目录 或文件 路径 不是程序的 exe文件路径 我尝试了一些我发现的方法 GetCurrentDir 获取当前目录路径 GetModuleFileName 获取可执行文件的路径 那么我怎样才能找到代码在哪个d
  • 将值传递给 loadURL - Android

    是否可以将值传递给 webView loadUrl 中提到的 URL 像这样的东西 webView loadUrl file android asset www index html value value 或者有什么方法可以将 Java
  • 他们是如何做到的呢?主屏幕上的对话框

    我正在编写一个 Android 应用程序 我想在主屏幕上放置一个对话框或视图 以便用户可以输入文本而无需跳转到我的完整应用程序 我似乎无法让它发挥作用 如果我呈现一个对话框 即使在透明活动中 我的应用程序就会启动 如果您不知道我在说什么 请
  • 什么时候最适合使用 Python 中的类?

    我对 python 和一般编程都很陌生 所以非常感谢对这一点的任何澄清 例如 在以下代码中 Using a class class Monster object def init self level damage duration pri
  • 分割给定字符串并准备 case 语句

    Table 表名 create table table name given dates timestamp set name varchar 插入记录 insert into table name values 2001 01 01 20