【问题标题】:How to join variable to specific row如何将变量连接到特定行
【发布时间】:2021-03-18 18:59:31
【问题描述】:

我正在尝试在 SQL Server 中按行加入变量。但是,我不确定如何选择性地映射它们。我有以下内容:

declare @p1 nvarchar(max) = '[{i:1, n:"one"}]'
declare @p2 nvarchar(max) = '[{i:2, n:"two"}]'
declare @p3 nvarchar(max) = '[{i:3, n:"three"}]'

select 
    [noRow] = row_number() over(order by [number] asc), 
    [table],
    [data1] = sd.one,
    [data2] = sd.two
from someDb sd
inner join @p1 on [noRow] = 1
inner join @p2 on [noRow] = 2
inner join @p2 on [noRow] = 3 
-- etc.

期望的输出

| noRow | data1 | data2 | table | 
|-------+-------+-------+-------|
| 1     | a     | b     | @p1   |
| 2     | c     | d     | @p2   |
| 3     | e     | f     | @p3   | 

如何将这些变量连接到 SQL Server 中的特定行?

【问题讨论】:

  • 数据库是什么版本的 SQL Server?这很重要,因为 SQL 2016 内置了 JSON 解析。最好的方法是将您的 JSON 解析为临时表,然后在您的临时表上进行连接。或者查看JSON解析,如果大小不太复杂,您可以直接进行。
  • 2016.我希望将 json 按行存储在单个表格单元格中。
  • 那么我建议首先解析每个 JSON,然后加入数据库中需要加入的字段。
  • 样本数据加上预期结果将有助于澄清。
  • 它仍然远未明确您想要的输出是什么......也不知道表格如何发挥作用。

标签: sql sql-server tsql variables join


【解决方案1】:

从您的 cmets 看来,您希望在 table 列中显示实际变量名称。我不太明白你为什么要这样,但这里有你的选择:

select
    sd.noRow,
    sd.data1,
    sd.data2,
    v.[table]
from (
    select 
        noRow = row_number() over(order by number asc), 
        data1 = sd.one,
        data2 = sd.two
    from someDb
) sd
inner join (values
    ('@p1',@p1),
    ('@p2',@p2),
    ('@p3',@p3)
) v([table],json) on JSON_VALUE(v.json, '$[0].i') = sd.norow

如果您想要完整的 JSON,那么您可以将选择列表中的 v.[table] 更改为 v.json

如果您想要 JSON 中的 n 值,那么您需要这个:

    [table] = JSON_VALUE(v.json, '$[0].n')

如果您有很多这些参数,您可能需要考虑使用表值参数。

【讨论】:

    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2022-01-02
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多