一列中有多个值的 SQL 查询

标签 sql sql-server-2008

我一直在 table 上敲着头试图解决这个问题。我有一个表,用于存储作业信息以及作业未完成的原因。原因为数字、01、02、03 等。待处理的工作可能有两个原因。如果您选择两个原因,它们将存储在同一列中,并以逗号分隔。这是 JOBID 表中的示例:

Job_Number     User_Assigned     PendingInfo

1              user1             01,02

还有另一个名为Pending的表,它存储这些值实际表示的内容。 01=信息不足,02=时间不够,03=等待审核。示例:

Pending_Num    PendingWord

01             Not Enough Info
02             Not Enough Time

我想做的是查询数据库以提供所有作业编号、用户、待处理信息和待处理原因。我可以分解第一个值,但不知道如何分解第二个值。到目前为止我的技能有限:

select Job_number,user_assigned,SUBSTRING(pendinginfo,0,3),pendingword
from jobid,pending
where
    SUBSTRING(pendinginfo,0,3)=pending.pending_num and
    pendinginfo!='00,00' and
    pendinginfo!='NULL'

我希望在这个例子中看到的是:

Job_Number  User_Assigned   PendingInfo   PendingWord       PendingInfo  PendingWord

1           User1           01            Not Enough Info   02           Not Enough Time

提前致谢

最佳答案

如果您的 SQL 想要单独处理多个项目,您确实不应该将它们存储在一列中。在这些情况下,您必须执行的“SQL 体操”既是丑陋的黑客行为,又会降低性能。

理想的解决方案是将各个项目拆分为单独的列,并且对于 3NF,如果您确实想要正确执行此操作,请将这些列作为行移动到单独的表中(但初步步骤可能是好吧,如果你确定在中短期内不会有超过两个原因)。

那么您的查询将变得更简单、更快。

<小时/>

但是,如果这不是一个选择,您可以使用前面提到的 SQL 操作来执行以下操作:

where find ( ',' |fld| ',', ',02,' ) > 0

假设您的 SQL 方言具有字符串搜索功能(在本例中为 find,但我认为 SQLServer 的 charindex)。

这将确保所有子列都以逗号开头(逗号加字段加逗号),并查找特定的所需值(两侧都有逗号以确保它是完整的子列匹配)。

<小时/>

如果您无法控制应用程序在该列中放置的内容,我会选择 DBA 解决方案 - DBA 解决方案被定义为 DBA 必须采取的措施来解决其不足之处用户:-)。

在该表中创建两个新列,并创建一个插入/更新触发器,该触发器将用用户放入原始列中的两个原因填充它们。

然后查询这两个列以获取特定值,而不是尝试拆分旧列。

这意味着拆分成本仅在行插入/更新上,而不是在_每个单个选择上,从而有效地摊销该成本。

<小时/>

不过,我的答案是重新构建架构。从长远来看,这将是速度、可读查询和可维护性方面的最佳方式。

关于一列中有多个值的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2800104/

相关文章:

MySQL 错误代码 1166。列名不正确

c# - SQL 数据从本地传输到实时服务器

.net - 将 blob 存储在 SQL Server 中而不将 blob 读入内存

sql - 在 SQL Server 2008 中将数据从浮点类型的 Excel 导入 varchar

mysql - 指定在排序结果中最后出现的值

mysql - SQL 查询排除出现在其他行中的记录?

asp.net-mvc - 如何从数据库检索 VarBinary 图像到 MVC View

sql-server - SQL Server Management Studio 中的默认编码

mysql - 如果mysql表中存在则忽略插入?

SQL获取范围内的用户