SQL 使用值列表更新一列的所有行
Posted
技术标签:
【中文标题】SQL 使用值列表更新一列的所有行【英文标题】:SQL Update all rows for one column with a list of values 【发布时间】:2020-10-29 15:49:46 【问题描述】:如何通过手动输入值来设置列的所有行?
我的表有 3 行,我希望名为 mycolumn
的列有 3 个值 a、b 和 c(当前这些值是 NULL
):
update mytable set mycolumn = ('a','b','c')
ORA-00907 missing right parenthesis
编辑:我的表非常简单,我有一列 ID INT NOT NULL
的值为 1、2、3,另一列 mycolumn
的所有值都为 NULL,我希望这些值变为 'a' where ID = 1
、'b' where ID=2
等.
EDIT2:我可能有大量的行,所以我想避免输入每个 ID 值来替换 mycolumn
。是不是可以自动将 1 到 3 的 ID 值与值 'a'、'b'、'c' 进行匹配,比如match(ID, ('a','b','c'))
可能
我只想通过增加ID
的顺序来替换mycolumn
的所有值。 ID
严格等同于我所说的矩阵中的行号
EDIT3:我想要一个解决方案,它可以在具有各种值的一般情况下工作,而不仅仅是为了简单起见这里给出的字母表中的字母。例如,如果我要在 mycolumn
中替换的值是 ('oefaihfoiashfe', 'fiaohoawdihoiwahopah', 'aefohdfaohdao')
怎么办?但是,ID
行号将始终是从 1 到 N 乘以 1 的序列。
【问题讨论】:
这个查询没有意义。请提供示例数据和期望的结果,以阐明您的真正要求。 嗯,除非值为'a,b,c'
,否则你不能那样做
查看编辑。很简单
请提供样本数据和期望的结果。
【参考方案1】:
显然,您应该在单个 update
中执行此操作。像这样:
update mytable
set mycolumn = case id when 1 then 'a' when 2 then 'b' when 3 then 'c' end
;
更紧凑(但也更神秘,仅适用于 Oracle,而case
表达式在 SQL 标准中):
update mytable
set mycolumn = decode(id, 1, 'a', 2, 'b', 3, 'c')
;
注意 - 这仅在确实只有三行时才有效。如果您有更多行,请确保在末尾添加where id in (1, 2, 3)
。否则所有 OTHER 值(在其他行中)将更新为 null
!
【讨论】:
谢谢,但是否可以避免每次都指定要替换哪个 ID?同样,我可能有大量行,因此无法输入。match
ID
值 1 到 3 是否可以自动转换为 'a', 'b', 'c'
值?
如果我想更新所有数以百万计的唯一值而不仅仅是 'a'、'b'、'c' 怎么办?查看编辑
@CatalystRPA - 以什么方式?例如:您可能有一个查找表,其中给出了此关联。 (一行中有 1 个“a”,另一行中有 2 个“b”,依此类推)如果这是您的情况,那么这么说。同样,我们无法猜测。所有可能的值是多少(除了“a”、“b”、“c”)?它们应该按什么顺序用于给定的 ID?
查看新的编辑,这应该很清楚。老实说,如果你不明白这一点,我不知道还能说什么。我想替换一列的值,而不必为每一行键入 where
子句或类似的子句 - 这严格对应于 ID
的值
@CatalystRPA - 你没有回答我的问题。价值观从何而来? ('a'、'b'、c' 和其他数千个值)。你怎么知道他们的顺序?在不知道这些细节的情况下,您如何期望得到问题的答案?【参考方案2】:
您可以尝试如下更新。这将更新 1 > a、2 > b、3 > c、4 > d 等。你达到了 ID 27,因为没有更多的字母,它将再次从 a 开始并继续沿字母表向下。
UPDATE mytable
SET mycolumn = CASE MOD (id, 26)
WHEN 0 THEN 'z'
ELSE CHR (MOD (id, 26) + 96)
END;
更新
要根据任何值列表进行更新,您可以尝试如下所示的更新语句。如果您将第 4 个项目添加到逗号分隔列表中,则 mytable 中的 ID 4 将设置为您指定的第 4 个值。
UPDATE mytable
SET mycolumn =
(SELECT COLUMN_VALUE
FROM (SELECT ROWNUM AS row_num, t.COLUMN_VALUE
FROM TABLE (
sys.odcivarchar2list ('oefaihfoiashfe',
'fiaohoawdihoiwahopah',
'aefohdfaohdao')) t)
WHERE row_num = id);
【讨论】:
我可以使用('a','b','c')
等代替CHR (MOD (id, 26) + 96)
吗?
不,您不能使用('a','b','c')
,因为这不是用于更新列的有效 Oracle 语法。
那么如果我的值不是 a, b, c 我的值是 ('oefaihfoiashfe', 'fiaohoawdihoiwahopah', 'aefohdfaohdao')
怎么办?查看编辑
刚刚添加了一个更新,应该允许您将 ID 更新为这些值。【参考方案3】:
嗯。 . .一行只能有一个值。也许像这样分配随机值:
update mytable
set mycolumn = (case floor(dbms_random.random * 3)
case 0 then 'a' case 1 then 'b' else 'c'
end)
【讨论】:
感谢您的回答,但我希望第一行在mycolumn
列中包含“a”,第二行为“b”,第三行为“c”
@CatalystRPA 。 . . SQL 表代表 无序 集。没有“第一”行这样的东西。
@CatalystRPA - 您需要解释“第一”、“第二”和“第三”的含义。 Gordon 部分正确 - SQL 表中的行是无序的,除非您指定顺序。那么 - 在您的实际问题中,“第一”行是什么意思?【参考方案4】:
如果您希望 3 行具有不同的值 a、b 和 c,那么您将必须编写 3 个更新语句。
update mytable set mycolumn = 'a' where id = 1;
update mytable set mycolumn = 'b' where id = 2;
update mytable set mycolumn = 'c' where id = 3;
【讨论】:
所以我要update set mycolumn = 'a' where ID =1
做三遍?如果我有 54687434643163465464 行数据怎么办?真的没有更简单的方法吗?
@CatalystRPA - 什么ID?这是您第一次谈到 ID 列。你明白为什么人们还不能帮助你吗?你没有解释完整的问题。我们无法读懂你的想法。
我看不出你的三个update
语句将如何导致三行在列中具有三个不同的值。相反,在第一次更新后,所有值都将是“a”;在第二次之后,所有将是 'b'(完全否定第一次更新),在第三次更新后也是如此。总的来说,在所有三个更新之后,列中的所有值都将是“c”。不好回答,抱歉。以上是关于SQL 使用值列表更新一列的所有行的主要内容,如果未能解决你的问题,请参考以下文章