【问题标题】:How to compare two comma separated string and insert in DB如何比较两个逗号分隔的字符串并插入数据库
【发布时间】:2022-11-10 23:18:34
【问题描述】:

我有下表(用户),有 2 列,并试图用第一列更新第二列(第一列是自动增量和主键字段)。

UserId  CatId
1         10
2         78
3         99
4         89
5         80

我发现很难用 P_uid order by (1,3,4) 更新第二列。我尝试了正常的Update statement,但它不起作用。我将以下 ID 传递给 SP。

P_uid varchar2(20) := '1,3,4';
P_new_cat_id varchar2(20) := '100,12,13';

Expected output
---------------
UserId  CatId
1         100
2         78
3         12
4         13
5         80

【问题讨论】:

  • 为什么要传递逗号分隔值的字符串?您必须对两个字符串进行标记并保持相关元素步调一致 - 假设您在两者中始终具有相同数量的元素。传递集合或值对的集合或仅执行三个单独的更新会更容易。什么在生成字符串,这些数据来自哪里?
  • @亚历克斯普尔。来自服务器端的数据是动态的。 p_uid 值可能会改变
  • 如果这些字符串超出您的控制范围,那么您将需要以某种方式标记它们。
  • @AlexPoole 我是甲骨文的新手。请解释标记化是什么意思
  • 标记化 = 将它们拆分为行,其中每一行包含每个列表中的一个标记。

标签: oracle plsql


【解决方案1】:

使用MERGE 语句:

MERGE INTO users dst
USING (
  SELECT 1 AS id, 100 AS new_catid FROM DUAL UNION ALL
  SELECT 3, 12 FROM DUAL UNION ALL
  SELECT 4, 13 FROM DUAL
) src
ON (src.id = dst.userid)
WHEN MATCHED THEN
  UPDATE
    SET catid = src.new_catid;

其中,对于样本数据:

CREATE TABLE users (UserId, CatId) AS
SELECT 1, 10 FROM DUAL UNION ALL
SELECT 2, 78 FROM DUAL UNION ALL
SELECT 3, 99 FROM DUAL UNION ALL
SELECT 4, 89 FROM DUAL UNION ALL
SELECT 5, 80 FROM DUAL;

然后,合并后,表包含:

USERID CATID
1 100
2 78
3 12
4 13
5 80

如果您有分隔字符串,那么(除了找到传递多行数据的更好解决方案之外)您可以使用行生成器函数将值拆分为行并使用前面的技术:

DECLARE
  P_uid varchar2(20) := '1,3,4';
  P_new_cat_id varchar2(20) := '100,12,13';
BEGIN
  MERGE INTO users dst
  USING (
    SELECT REGEXP_SUBSTR(p_uid,        'd+', 1, LEVEL) AS id,
           REGEXP_SUBSTR(p_new_cat_id, 'd+', 1, LEVEL) AS new_catid
    FROM   DUAL
    CONNECT BY LEVEL <= LEAST(
                          REGEXP_COUNT(p_uid,        'd+'),
                          REGEXP_COUNT(p_new_cat_id, 'd+')
                        )
  ) src
  ON (src.id = dst.userid)
  WHEN MATCHED THEN
    UPDATE
      SET catid = src.new_catid;
END;
/

哪个输出相同。

db<>小提琴here

【讨论】:

  • 第一部分是硬编码的。
  • @atc 然后将字符串拆分为行并使用它。更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多