我一直在 table 上跳动,试图弄清楚这一点。我有一个表,用于存储作业信息以及作业未完成的原因。原因是数字,01、02、03等。您有两个原因来等待工作。如果选择两个原因,它们将存储在同一列中,并用逗号分隔。这是 JOBID 表中的示例:
Job_Number User_Assigned PendingInfo
1 user1 01,02
还有另一个名为待处理的的表,该表存储这些值实际代表的内容。 01 =没有足够的信息,02 =没有足够的时间,03 =等待审阅。例子:
Pending_Num PendingWord
01 Not Enough Info
02 Not Enough Time
我想做的是查询数据库,以提供所有工作编号,用户,pendinginfo和pending原因。我可以突破第一个值,但不知道如何执行第二个值。到目前为止,我有限的技能是什么:
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必须解决那些用户不足之处的解决方案:-)。
在该表中创建两个新列,并创建一个插入/更新触发器,该触发器将使用用户放入原始列的两个原因来填充它们。
然后,在那两个新列中查询特定值,而不是尝试拆分旧列。
这意味着拆分的成本仅在行插入/更新时发生,而不在_every single select`上发生,从而有效地分摊了该成本。
不过,我的答案是重新执行架构。从速度,可读性和可维护性方面来看,从长远来看,这将是最好的方法。
关于SQL查询在一列中包含多个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2800104/