【问题标题】:Achieve the same result from this postgresql query in SQL Server 2017在 SQL Server 2017 中通过此 postgresql 查询获得相同的结果
【发布时间】:2020-01-23 05:33:01
【问题描述】:

我有以下在 postgresql-9.6 中运行的查询,我需要在 SQL Server DB 上实现相同的输出。

这是查询,我已将数据库中的所有字段替换为无论如何都会来自它们的字符串值(数据库字段为:“primary_key_fields”、“primary_key_values”、“table_name”、“min_sequence”):

SELECT 
UNNEST(STRING_TO_ARRAY(demo.primary_key_fields, ',')) AS primary_key_fields,    
UNNEST(STRING_TO_ARRAY(demo.primary_key_values, ',')) AS primary_key_values, 
table_name, 
min_sequence, 
ROW_NUMBER() OVER(partition by demo.primary_key_fields) AS rn

FROM (
    SELECT
    'Name,surname,age,location,id' AS primary_key_fields,
    'Nash,Marley,27,South Africa,121' AS primary_key_values,
    'person' AS table_name, 
    '1' AS min_sequence

    UNION ALL
    SELECT
    'Name,surname,age,location,id' AS primary_key_fields,   
    'Paul,Scott,25,South America,999' AS primary_key_values, 
    'person' AS table_name, 
    '1' AS min_sequence
    ) demo

我期待以下输出:

非常感谢您的帮助。我正在使用 SQL Server 2017。

【问题讨论】:

  • SQL Server 不像 Postgres 那样支持数组。请在您的问题中添加示例数据。
  • 这个查询应该做什么? UNNESTSTRING_TO_ARRAY 都不是 SQL 的一部分,它们是特定于供应商的函数。甚至在 PostgreSQL 中ROW_Number 也需要一个 ORDER BY,否则返回的行号将是任意的
  • 也就是说,STRING_SPLIT 拆分字符串并将单个元素作为表格返回。这可能与使用UNNEST(STRING_TO_ARRAY() 相同。即使在 PostgreSQL 中,存储 CSV 值 而不是使用正确的列也是一个严重的设计问题
  • 这听起来像XY Problem。有一个问题 X,尝试的解决方案 Y 是将键值和字段连接成字符串。这在任何数据库中都是一个非常糟糕的主意——你将如何在查询中使用这些值?因此,当查询变得不可能时,尝试拆分字符串而不是返回并修复原始问题。 原来的问题是什么?
  • 如果是将硬编码数据放入 SQL for MS SQL Server 中,那么您可能应该检查从值中选择是否可以帮助您。一个 SO 示例here

标签: sql-server tsql split sql-server-2017


【解决方案1】:

不再需要。这个问题可以关闭。没有找到解决方案,更改了源系统以适应需要。

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 2017-12-15
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多