SQL-基于特定对象属性替换值

发布于 2025-02-13 20:34:33 字数 672 浏览 0 评论 0原文

我正在尝试在SQL中编写有条件的更新语句,该语句查看一系列对象,并根据另一个对象的属性更新一个对象属性。以下是我要更新的signal_key列中对象的示例。

{
  "entities": [
    {"type": "MERCHANT", "value": "AAAA"}, 
    {"type": "MERCHANT", "value": "CCC"}], 
  "signalType": "TRANSACTION", 
  "signalVersion": "0"
}

基于“ value”字符串,我想将“类型”从商家更新为id。我有没有办法专门检查值,而不是使用像之类的东西,它会在整个对象中寻找字符串比较?下面,signal_key ???指示我要问的查询的部分。

UPDATE signals
SET signal_key??? =  CASE
        WHEN signal_key??? = 'AAAA' THEN 'BBBB'
        WHEN signal_key??? = 'CCC' THEN 'DDD'
        ELSE signal_key???
    END
WHERE signal_key??? IN ('AAAA', 'CCC')

I'm trying to write a conditional update statement in SQL that looks at an array of objects, and updates one object property based on another object's property. Below is an example of an object in the signal_key column that I'm trying to update.

{
  "entities": [
    {"type": "MERCHANT", "value": "AAAA"}, 
    {"type": "MERCHANT", "value": "CCC"}], 
  "signalType": "TRANSACTION", 
  "signalVersion": "0"
}

Based on the "value" string, I want to update the "type" from MERCHANT to ID. Is there a way for me to specifically check value instead of using something like LIKE that would look for a string comparison in the whole object? Below, signal_key??? indicates the portion of the query that I am asking about.

UPDATE signals
SET signal_key??? =  CASE
        WHEN signal_key??? = 'AAAA' THEN 'BBBB'
        WHEN signal_key??? = 'CCC' THEN 'DDD'
        ELSE signal_key???
    END
WHERE signal_key??? IN ('AAAA', 'CCC')

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小女人ら 2025-02-20 20:34:33

基于值字符串的长度

您可以使用len(my_field)检查长度

UPDATE some_table
SET some_field = CASE
        WHEN len(another_field) = 4 THEN 'BBBB'
        WHEN len(another_field) = 3 THEN 'DDD'
        ELSE 0
    END
WHERE 1=1

编辑:基于相关数据更新:

首先创建一个CTE(常见表达式,使用带有),其中包含每个项目,其中包含相关项目的长度。在下面的示例中,CTE包含每个项目ID,其中包含相关项目的计数(或“长度”)。

然后发出更新语句,该语句使用与要更新的表连接的长度表。

with lengths (id, length) as (
    select t1.id, count(related.id)
    from test_table_1 t1
    inner join test_table_related_data related on related.parentId = t1.id
    group by t1.id
)
update t1
set t1.name = case when l.length = 1 then 'one' else 'a lot!!!' end
from test_table_1 t1
inner join lengths l on l.id = t1.id

Based on the length of the value string

You can use Len(my_field) to check the length

For example:

UPDATE some_table
SET some_field = CASE
        WHEN len(another_field) = 4 THEN 'BBBB'
        WHEN len(another_field) = 3 THEN 'DDD'
        ELSE 0
    END
WHERE 1=1

Edit: To update based on related data:

First create a CTE (common table expression, using with) that contains each item with the length of the associated items. In the example below the CTE contains each item id with the count (or "length") of associated items.

Then issue an update statement that uses the length table joined with the table you want to update.

with lengths (id, length) as (
    select t1.id, count(related.id)
    from test_table_1 t1
    inner join test_table_related_data related on related.parentId = t1.id
    group by t1.id
)
update t1
set t1.name = case when l.length = 1 then 'one' else 'a lot!!!' end
from test_table_1 t1
inner join lengths l on l.id = t1.id
简单爱 2025-02-20 20:34:33

要解析JSON,您应该使用SQL Server的JSON功能。

您需要在相关的子查询中使用OpenJson以找到正确的修改索引。

如果您只想修改每行单个值,则可以这样做。

UPDATE s
SET signal_key = JSON_MODIFY(
        s.signal_key,
        '$.entities[' + j.[key] + '].value',
        'BBBB')
FROM signals s
CROSS APPLY (
    SELECT TOP (1) j.[key]
    FROM OPENJSON(s.signal_key, '$.entities') j
    WHERE JSON_VALUE(j.value, '$.value') = 'AAAA'
) j;

否则您需要重建JSON阵列

UPDATE s
SET signal_key = JSON_MODIFY(
        s.signal_key,
        '$.entities',
        j.entities)
FROM signals s
CROSS APPLY (
    SELECT
      j.type,
      value = CASE j.value
                WHEN 'AAAA' THEN 'BBBB'
                WHEN 'CCC' THEN 'DDD'
                ELSE j.value
              END
    FROM OPENJSON(s.signal_key, '$.entities')
      WITH (
        type varchar(100),
        value varchar(100)
      ) j
    FOR JSON PATH
) j(entities);

To parse JSON, you should use SQL Server's JSON capabilities.

You need to use OPENJSON in a correlated subquery to find the right index to modify.

If you only want to modify a single value per row, you can do it like this.

UPDATE s
SET signal_key = JSON_MODIFY(
        s.signal_key,
        '$.entities[' + j.[key] + '].value',
        'BBBB')
FROM signals s
CROSS APPLY (
    SELECT TOP (1) j.[key]
    FROM OPENJSON(s.signal_key, '$.entities') j
    WHERE JSON_VALUE(j.value, '$.value') = 'AAAA'
) j;

Otherwise you need to rebuild the JSON array

UPDATE s
SET signal_key = JSON_MODIFY(
        s.signal_key,
        '$.entities',
        j.entities)
FROM signals s
CROSS APPLY (
    SELECT
      j.type,
      value = CASE j.value
                WHEN 'AAAA' THEN 'BBBB'
                WHEN 'CCC' THEN 'DDD'
                ELSE j.value
              END
    FROM OPENJSON(s.signal_key, '$.entities')
      WITH (
        type varchar(100),
        value varchar(100)
      ) j
    FOR JSON PATH
) j(entities);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文