SQL 字符串拆分为单列

2024-01-09

对 SQL 非常陌生,但我需要一些帮助,我确信这是一个简单的修复。

我在名为“Produce”的表中有一列数据,其中水果类型存储在名为“Fruit”的列中。此列中的某些值以逗号分隔。

有没有一种简单的方法来分割下面的内容,以便结果作为唯一条目的单列?

例如。示例表

Fruit
-----
Apple
Plum
Pear, Mango
Pear

我希望返回的是以下内容:

Fruit
-----
Apple
Plum
Pear
Mango

我尝试过使用字符串分割功能,但我想我已经完全掌握了。任何人都可以帮忙解释一下如何做到这一点吗?如果有帮助的话我正在使用 T-SQL。

提前致谢。


要解决的核心问题是停止将值存储为逗号分隔列表。保持数据标准化。话虽这么说...每个人都需要一个好的分离器...

declare @table table (Fruit varchar(64))
insert into @table
values
('Apple'),
('Plum'),
('Pear,Mango'),
('Pear')

select distinct
    Item
from
    @table
cross apply
    dbo.DelimitedSplit8K(Fruit,',')

或者,如果您使用的是 SQL Server 2016...

select distinct
    Item
from
    @table
cross apply
    string_split(Fruit,',')

功能

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[DelimitedSplit8K] (@pString VARCHAR(8000), @pDelimiter CHAR(1))
--WARNING!!! DO NOT USE MAX DATA-TYPES HERE!  IT WILL KILL PERFORMANCE!

RETURNS TABLE WITH SCHEMABINDING AS
RETURN

/* "Inline" CTE Driven "Tally Table" produces values from 1 up to 10,000...
enough to cover VARCHAR(8000)*/

  WITH E1(N) AS (
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
                ),                          --10E+1 or 10 rows
       E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
       E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
 cteTally(N) AS (--==== This provides the "base" CTE and limits the number of rows right up front
                     -- for both a performance gain and prevention of accidental "overruns"
                 SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
                ),
cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter)
                 SELECT 1 UNION ALL
                 SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
                ),
cteLen(N1,L1) AS(--==== Return start and length (for use in substring)
                 SELECT s.N1,
                        ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000)
                   FROM cteStart s
                )
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found.
 SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
        Item       = SUBSTRING(@pString, l.N1, l.L1)
   FROM cteLen l
;
GO

Jeff Moden 的函数文章 http://www.sqlservercentral.com/articles/Tally+Table/72993/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 字符串拆分为单列 的相关文章

  • 转置和聚合 Oracle 列数据

    我有以下数据 Base End RMSA Item 1 RMSA Item 2 RMSA Item 3 RMSB Item 1 RMSB Item 2 RMSC Item 4 我想将其转换为以下格式 Key Products RMSA RM
  • 如何在 SQL 中选择“上一条”和“下一条”记录?

    I am building a blog post detail page on my site that will display display a previous and next link similar to how a typ
  • Postgres 上的 C 语言环境和 Posix 语言环境有什么区别?

    我知道 Postgres 上的数据库区域设置负责国家字符的正确顺序 正确的小写 大写等 但为什么有两种语言中立的语言环境 posix and c 它们之间有什么区别 还是只是一个中立的语言环境有两个不同的名称 UPDATE正如 Magnus
  • 需要Python字长函数示例

    我的家庭作业有点困难 我本来应该编写一个函数 limitWords 将输入限制为 20 个单词 如果输入超过 20 个单词 则将输入截断为仅 20 个单词 我使用 len text split 作为计算单词的方法 因此 20 个或更少的部分
  • 从字符串中删除重音符号

    Android 中有没有什么方法 据我所知 没有 java text Normalizer 可以从字符串中删除任何重音 例如 变成 eau 如果可能的话 我想避免解析字符串来检查每个字符 java text NormalizerAndroi
  • 从 SQL Server 中的子查询值或其他聚合函数获取平均值

    我有 SQL 语句 SQL Server SELECT COUNT ActionName AS pageCount FROM tbl 22 Benchmark WHERE DATEPART dw CreationDate gt 1 AND
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • Wordnet sqlite 同义词和示例

    我正在尝试获取给定 wordid 的同义词和示例列表 经过大量的试验和错误 我可以获得所有同义词集的样本 但不是实际的同义词 这是我的查询 它给出了以下结果 select senses wordid senses synsetid sens
  • 通过字符串操作预防 PHP SQL 注入[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中防止 SQL 注入的最佳方法 https stackoverflow com questions 60174 best way to prevent sql injection in php
  • MySQL解释更新

    作为我大学复习的一部分 我试图回答以下问题 至少在表的一个属性上创建索引 employees 数据库 您可以在其中使用 MySQL EXPLAIN 工具 清楚地显示好处 在条款或检索方面 和负面 在 更新条款 创建相关索引的信息 对于第一部
  • SQL查询获取最后两条记录的DateDiff

    我有一个名为 Event 的表 其中 eventNum 作为主键 日期作为 SQL Server 2008 R2 中的 datetime2 7 我试图获取表中最后两行的日期并以分钟为单位获取差异 这就是我目前所拥有的 Select DATE
  • 子字符串和 Go 垃圾收集器

    在 Go 中获取字符串的子字符串时 不会分配新的内存 相反 子字符串的底层表示包含一个数据指针 该指针是原始字符串的数据指针的偏移量 这意味着 如果我有一个大字符串并希望跟踪一个小子字符串 则垃圾收集器将无法释放任何大字符串 直到我释放对较
  • 在bigquery中比较两个表的有效方法

    我有兴趣比较两个表是否包含相同的数据 我可以这样做 standardSQL SELECT key1 key2 FROM SELECT table1 key1 table1 key2 table1 column1 table2 column1
  • 使用显式值进行 BigQuery 合并

    据我所知 BigQuery 支持合并两个表 目前 INSERT操作允许将显式值插入表中 例如 INSERT dataset Inventory product quantity VALUES top load washer 10 front
  • If Else 条件的 SQLite 语法

    我正在使用 SQLite 数据库 我的表有一个名为 密码 的文本列 早些时候 为了检索我用来执行简单操作的值select from myTable询问 但现在的要求是 如果Password值不是NULL那么我需要将其显示为 是 或 否 它是
  • 在 SELECT 中将列值拆分为两列?

    我在 varchar 列中有一个字符串值 它是一个由两部分组成的字符串 在它到达数据库之前分割它不是一个选择 该列的值如下所示 one column part1 part2 part1 part2 所以我想要的是一个如下所示的结果集 col
  • 选择两列中两个日期之间的记录

    如何选择两列中两个日期之间的记录 Select From MyTable Where 2009 09 25 is between ColumnDateFrom to ColumnDateTo 我有一个日期 2009 09 25 我喜欢选择
  • 常量值如何影响连接的 ON 子句?

    我最近发现 LEFT JOIN 的 ON 子句可能包含 1 1 等值 这让我感到不安 因为它打破了我对连接功能的看法 我遇到过以下情况的更详细版本 SELECT DISTINCT Person ID FROM Person LEFT JOI
  • jDBI中如何进行内查询?

    我怎样才能在 jDBI 中执行这样的事情 SqlQuery select id from foo where name in
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可

随机推荐

  • 在使用 LDAP 验证之前对密码进行哈希处理

    我有一个基于网络的工具 在登录表单上 密码将在发送之前进行哈希处理 一切都很好 数据库只存储散列密码 现在 我们想要使用 LDAP 登录DirectoryEntry 但构造函数只接受纯密码 我的问题 如何将哈希密码传递给DirectoryE
  • 未使用 OpenJPA 从数据库检索主键 (ID)(?)

    这是一个向 mysql 数据库写入和读取的简单程序 当我输入测试数据时 所有数据都在 mySQL 客户端中可见 然而 当我使用 OpenJPA 检索相同的数据时 所有 id 都显示为 0 但名称是正确的 交易过程中ID丢失可能是什么原因 P
  • Django 中使用 Nginx 和 Gunicorn 时出现奇怪的 CSRF 错误

    背景 当我尝试访问 Django 管理面板时 我得到Forbidden 403 CSRF verification failed Request aborted 即使我禁用 CSRF 中间件 这会影响位于不同位置 使用不同浏览器的所有用户
  • 将 Python NumPy 数组插入 PostgreSQL 数据库

    如何将大量坐标 x y 插入到 postgresQL 表中 我不想使用for环形 它是一个 3601x3601 像素的栅格 import numpy as np import psycopg2 Data example east np li
  • 在 ruby​​ on Rails 中渲染替代视图

    我的控制器中有以下代码 def create severity Severity new params severity if severity save flash notice Successfully created severity
  • 模型绑定两个或多个集合

    有没有人有幸使用 Phil Haack 在这里发布的代码绑定两个或多个集合的模型 模型绑定到列表 http haacked com archive 2008 10 23 model binding to a list aspx 作为示例 我
  • python 中如何判断连接是否已断开

    我希望我的 python 应用程序能够知道另一端的套接字何时被删除 有没有办法呢 简短回答 使用非阻塞recv 或者阻塞recv select 超时时间短 长答案 处理套接字连接的方法是根据需要进行读取或写入 并准备好处理连接错误 TCP
  • 使用 Spring Data Rest 时公开所有 ID

    我想使用 Spring Rest 接口公开所有 ID 我知道默认情况下这样的 ID 不会通过其余接口公开 Id GeneratedValue strategy GenerationType IDENTITY Column unique tr
  • C# MVC4 Web API - 生成的 JSON 应返回对象而不是对象的 $ref

    我有一个使用 EntityFramework for ORM 的 ASP NET MVC 4 Web API 应用程序 在我返回的 JSON 中 在某些情况下 多个父节点存在相同的子节点 在这些情况下 子节点的第一次出现及其所有成员都是完全
  • 根据角度中的用户ID从数据库获取用户角色

    我正在使用 身份验证服务 来保留所有用户身份验证功能 当用户通过身份验证时 我获取用户的 ID 并从数据库表中获取相关记录 但无法获取 角色 字段的值 我在构造函数中使用的代码是这样的 constructor private firebas
  • 强制解析可选组

    我正在尝试创建一个从报告文件中提取数据的正则表达式字符串 棘手的部分是我需要这个单个正则表达式字符串来匹配多个报告文件内容格式 我希望正则表达式始终匹配 即使未找到某些可选组 取以下报告文件内容 Note 2 缺少 val2 部分 文件 1
  • 如何使用 C# 下载并解压 gzip 压缩文件?

    我需要定期下载 提取并保存内容http data dot state mn us dds det sample xml gz http data dot state mn us dds det sample xml gz到磁盘 有人有使用
  • 是否可以分解functions.php 文件?

    我目前正在开发一个 WordPress 网站 选择的购物平台是 WooCommerce 我想创建一系列模板文件 在content product single php文件 其中包含数学计算 由于某种原因 数学计算似乎只有在放入functio
  • HTTPS 适用于闪亮的应用程序?

    有什么想法可以将 HTTPS 添加到 Shiny 应用程序吗 我遇到了下面的一些指南 但不确定它们是否可靠 只需 4 个简单步骤即可向 Shiny 服务器添加身份验证 https auth0 com blog adding authenti
  • Akka Actors:需要一个例子来理解一些基础知识

    我正在修改 Akka 需要一些建议来实现我想要的特定内容 我想要一个可以发送给我的演员DownloadFile URI File 消息并下载 由于这可以并行 我不想一个接一个地下载文件 但并发下载有限制 用 Akka 建模这样的东西的预期方
  • 使用Python水平组合多个图像

    我正在尝试在 Python 中水平组合一些 JPEG 图像 Problem 我有 3 张图片 每张图片都是 148 x 95 请参阅附件 我刚刚制作了同一张图像的 3 个副本 这就是为什么它们是相同的 我的尝试 我正在尝试使用以下代码水平连
  • QT QTcpServer::incomingConnection(qintptr 句柄)未触发?

    我第一次尝试使用 Qt 创建多线程服务器 通常我们会使用由QTcpServer nextPendingConnection 套接字句柄已经嵌入 但由于我在单独的线程上与连接客户端进行交互 所以我需要使用单独创建套接字qintptr hand
  • 在manifest.xml 文件中使用-permission 与 android 权限的权限

    我注意到清单文件中有两种类型的权限 permission 和 uses permission 如下所示的两种
  • Pandas:根据行值选择列

    我有一个非常大的pandas Dataframe并希望通过选择其中一行具有特定值的所有列来创建一个新的数据框 A B C D E Region Nord S d West Nord Nord value 2 3 1 2 4 2 0 5 1
  • SQL 字符串拆分为单列

    对 SQL 非常陌生 但我需要一些帮助 我确信这是一个简单的修复 我在名为 Produce 的表中有一列数据 其中水果类型存储在名为 Fruit 的列中 此列中的某些值以逗号分隔 有没有一种简单的方法来分割下面的内容 以便结果作为唯一条目的