【问题标题】:TSQL Array Initialization and LINQ Where on ArrayTSQL 数组初始化和 LINQ Where on Array
【发布时间】:2020-06-15 16:53:04
【问题描述】:

我正在尝试对 T-SQL 中的地址执行字符串聚合,以便在逗号分隔的字符串中使用任何非 NULL 的地址字段。我知道如何在 C# 中执行此操作,但对 SQL 感到迷茫。

这是我目前所拥有的(我需要将 C# 部分转换为 SQL):

SELECT STRING_AGG
(
    --Start of C# (I don't know how to convert this into SQL).
    new[]
    {
        Addresses.Line1,
        Addresses.Line2,
        Addresses.Line3,
        Addresses.City,
        Addresses.County,
        Addresses.State,
        Countries.Name,
        Addresses.Postcode
    }
    .Where(data => data != null)
    --End of C#
    ,
    ', '
) Address
FROM Addresses
JOIN Countries ON Countries.Id = Addresses.CountryId

【问题讨论】:

  • 尝试 DBNull.Value 而不是 null。
  • @jdweng 这里的问题是关于 TSQL 的; C# 纯粹是为了表达意图

标签: c# sql tsql initialization string-aggregation


【解决方案1】:

然而,就我个人而言,我会将它们作为列带回来并担心应用程序代码中的格式!

STRING_AGG 真正用于连接 row 数据;你正在使用,所以你最好做一些类似的事情:

SELECT CONCAT(Addresses.Line1,
    N', ' + Addresses.Line2,
    N', ' + Addresses.Line3,
    -- ...
    N', ' + Addresses.Postcode)

CONCAT 忽略 null 值,如果 {some column}nullN',' + {some column} 将是 null,因此这将删除所有省略值的中间分隔符。它确实有点假设Line1 有一个值 - 没有它,可能会有一个前导逗号。如果需要,您可以删除它。

【讨论】:

  • 嗯,它并不完美,但对于我需要它的目的来说已经足够了(如果通过 UI 输入,Line1 是强制性的)。
  • 我确实想知道是否有一种方法可以使用sys.columnsINFORMATION_SCHEMA 表将列转换为行 - 对于我的示例来说这可能有点过头了,但我有兴趣看看它是否可能。
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2012-02-10
相关资源
最近更新 更多