可以在 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章