分割给定字符串并准备 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 语句 的相关文章

  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • 从 PostgreSQL 中同一列中以其他值开头的列中检索所有值的有效方法

    为了简单起见 假设您有一个包含如下数字的表 number 123 1234 12345 123456 111 1111 2 700 检索最短数字的有效方法是什么 称它们为roots或其他 和所有值derived来自他们 例如 root de
  • PostgreSQL 中的 Long 数据类型相当于什么?

    我想知道相当于什么LongPostgreSQL 中的数据类型 根据the docs http www postgresql org docs 7 4 interactive datatype html DATATYPE INT看起来像big
  • 需要按天分割日期时间范围

    我有一个需要根据日期时间拆分的表 输入表 ID Start End A 2019 03 04 23 18 04 2019 03 04 23 21 25 A 2019 03 04 23 45 05 2019 03 05 00 15 14 所需
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • SQL 查询用于计算每个客户的订单数量和总金额

    我有两张桌子Order与列 OrderID OrderDate CID EmployeeID And OrderItem与列 OrderID ItemID Quantity SalePrice 我需要返回客户 ID CID 每个客户的订单数
  • 为什么 PostgreSQL 不能做这个简单的 FULL JOIN 呢?

    这是包含 2 个表的最小设置a and b每行 3 行 CREATE TABLE a id SERIAL PRIMARY KEY value TEXT CREATE INDEX ON a value CREATE TABLE b id SE
  • 由于键更改而尝试插入时外键约束失败

    我有一个 Content 对象 它引用多对多关系中的一组 Tag 对象 作为持久化新内容对象的一部分 我在 PostgreSQL 中查看标签是否已存在 如果存在 则将对其的引用添加到内容对象并尝试保存内容对象 我遇到的问题是 当我这样做时
  • PostgreSQL-过滤日期范围

    我是一名 SQL 开发人员 大部分时间都花在 MSSQL 上 我正在寻找一种更好的方法来过滤 PostgreSQL 数据库中的 无时区时间戳 字段 我在用着 Where DateField gt 2010 01 01 and DateFie
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 内置函数将每个单词的第一个字母大写

    如果 SQL Server 中已存在此类函数 我不想为此创建自定义函数 输入字符串 This is my string to convert预期输出 This Is My String To Convert SET ANSI NULLS O
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • 数字表与递归 CTE 生成一系列数字

    为什么使用数字表比使用递归 CTE 动态生成它们要快得多 在我的机器上 给定一张桌子numbers单列n 主键 包含从1到100000的数字 查询如下 select n from numbers 大约需要 400 毫秒才能完成 使用递归 C
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 如何获取自定义订单的结果? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 代替ASC or DESC 我希望我的查询结果采用特定的自定义顺序 例如 如果我想要的结果不是 A B C D 而是 P A L H 该怎么
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作

随机推荐

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

    我有一个充满复选框的表格 如下所示 我希望能够按住鼠标并拖动以激活多个复选框 我不知道从哪里开始 我寻找答案 但只找到了另一个线程有人询问如何做 但没有答案 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