【问题标题】:Convert PostgreSQL query to SQL Server query将 PostgreSQL 查询转换为 SQL Server 查询
【发布时间】:2020-03-06 07:52:33
【问题描述】:

我需要转换我的查询

select 
    unnest(string_to_array(names, ',')) as "Admin Name",
    unnest(string_to_array(phones, ',')) as "Admin Phone",
    unnest(string_to_array(emails, ',')) as "Admin Emails"
from 
    metadata_Table

到等效的 SQL Server 查询。

有什么建议吗?

【问题讨论】:

  • 将姓名/电话/电子邮件存储为逗号分隔值违反 1NF(原子性)。我会考虑重构表格。无论如何STRING_SPLIT 可能会有所帮助
  • 请显示样本数据和期望的结果。

标签: sql-server postgresql tsql split database-migration


【解决方案1】:

在 SL Server 中您无法做到这一点。没有“带有序数的 string_split()”。而且,string_split() 不保证订购。

在微软增强这个功能之前,我的建议是递归子查询:

with cte as (
      select convert(varchar(max), null) as name, convert(varchar(max), null) as phone, convert(varchar(max), null) as email,
             convert(varchar(max), names + ',') as names_rest,
             convert(varchar(max), phones + ',') as phones_rest,
             convert(varchar(max), emails + ',') as emails_rest,
             0 as lev
      from metadata_Table
      union all
      select left(names_rest, charindex(',', names_rest) - 1),
             left(phones_rest, charindex(',', phones_rest) - 1),
             left(emails_rest, charindex(',', emails_rest) - 1),
             stuff(names_rest, 1, charindex(',', names_rest), ''),
             stuff(phones_rest, 1, charindex(',', phones_rest), ''),
             stuff(emails_rest, 1, charindex(',', emails_rest), ''),
             lev + 1
      from cte
      where emails_rest like '%,%'
     )
select *
from cte
where lev > 0;

【讨论】:

  • Msg 402, Level 16, State 1, Line 31 数据类型 text 和 varchar 在 add 运算符中不兼容。这就是我得到的
  • @noyraz 任何人,包括你在内,都不应该在这么晚的时候使用文本数据类型。现在更改您的架构,在您完成此更改需要更多工作之前。
猜你喜欢
  • 2015-11-29
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多