如何将变量连接到特定行

Posted

技术标签:

【中文标题】如何将变量连接到特定行【英文标题】: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,然后加入数据库中需要加入的字段。 样本数据加上预期结果将有助于澄清。 它仍然远未明确您想要的输出是什么......也不知道表格如何发挥作用。 【参考方案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')

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

【讨论】:

以上是关于如何将变量连接到特定行的主要内容,如果未能解决你的问题,请参考以下文章

如何首先在 Xamarin.Android 中以编程方式连接到特定的 SSID?

将 Access 表中的多个列连接到一个特定行

Discord 如何连接到特定进程的音频?

如何将变量连接到 Entry 小部件?

如何将滑块连接到 MFC 中的变量

XSLT:如何将值连接到全局变量