可以在 VIEW 中使用 String_Split 吗?

Posted

技术标签:

【中文标题】可以在 VIEW 中使用 String_Split 吗?【英文标题】:Can String_Split be used in a VIEW? 【发布时间】:2021-10-14 19:36:43 【问题描述】:

我在一个用逗号分隔的单列中有一个包含多个 IP 地址的表,我正在使用以下查询,并且在选择中使用它时效果很好,但是当我尝试创建视图时它不起作用,它给我错误

无效的对象名称'string_split'。

string_split 可以在视图中实际使用吗?我可以使用 SP,但它确实有助于它的视图,因为我需要使用其他视图和 UNION ALL

对该结果进行多次连接
SELECT 
      distinct [ColumnA]
      ,[ColumnB]
      ,cs.value as IPs
  FROM [table] as A
  cross apply string_split( 
    replace(
    replace(
            replace(
                replace([value], '-', ',')
                , ';', ',')
            , '_', ',')
            , ' ', ',')
    , ',')cs
  where A.[value] <> ''
  and cs.value like '%.%.%.%' --and cs.value like '%host%'
  order by 3

数据通常也有很多垃圾文本,比如系统或其他词,所以我用替换过滤掉它们,所以string_split 也将它拆分,然后我使用 where 来删除所有不是一个IP

数据示例

ColumnA ColumnB IPs
SomeText MoreText 10.10.10.10,10.10.10.11,10.10.10.12

作为查询使用时的结果示例

ColumnA ColumnB IPs
SomeText MoreText 10.10.10.10
SomeText MoreText 10.10.10.11
SomeText MoreText 10.10.10.12

【问题讨论】:

仅供参考,不推荐按序号列号排序作为最佳做法。使用列名。 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。 你的 SQL 有错误,你的内部替换应该引用列 [IPs] 您绝对可以在视图中使用string_split,请参阅dbfiddl。如果我是你,我会将替换功能移到单独的 cross apply 中,这样你就可以单独调试它 - 而不是在一个语句中完成所有操作。 您的数据库需要在兼容级别 130 【参考方案1】:

您的查询在 view 中运行良好,如下所示。请注意,SQL Server 2017 引入了 Translate,您可以使用它来代替嵌套的 Replace 函数

create or alter view test as 

select ColumnA, ColumnB, cs.[value] as IPs
from t
cross apply string_split( translate(IPs, '-;_ ', ',,,,'),',')cs
where cs.[value] <> ''
and cs.value like '%.%.%.%' 

GO

select * from test
order by IPs

【讨论】:

遗憾的是我们的数据库是 SQL Server 2016,但翻译看起来很棒!谢谢!显然我做错的是 order by,当尝试使用视图编辑器时,它会给我其他东西的错误,但是现在我尝试使用 CREATE 手动创建视图,它告诉我放弃 order by 并最终让我 我建议不要使用内置的 GUI 设计器。除非您还指定 top,否则视图不能包含 order by,因为视图的结果是派生表并且表没有排序,因此始终在查询中明确说明排序条件。现在您有(另一个)理由加快升级 ;-)

以上是关于可以在 VIEW 中使用 String_Split 吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 string_split 函数查询更新字符串

String_Split 使用 SQL 以逗号分隔列

使用string_split从多个列创建行

MS SQL Server的STRING_SPLIT和STRING_AGG函数

ABAP 字符串处理

将逗号插入 varchar 子字符串