【发布时间】: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 那样支持数组。请在您的问题中添加示例数据。
-
这个查询应该做什么?
UNNEST和STRING_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