SQL Query在一列中包含多个值

lp1*_*lp1 5 sql sql-server-2008

我一直在桌子上敲打着试图弄清楚这个.我有一张表来存储工作信息,以及工作未完成的原因.原因是数字,01,02,03等.您可以将两个原因作为待处理作业.如果选择两个原因,它们将存储在同一列中,并以逗号分隔.这是JOBID表中的一个示例:

Job_Number     User_Assigned     PendingInfo

1              user1             01,02
Run Code Online (Sandbox Code Playgroud)

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

Pending_Num    PendingWord

01             Not Enough Info
02             Not Enough Time
Run Code Online (Sandbox Code Playgroud)

我正在尝试做的是查询数据库,以便为我提供所有工作号,用户,pendinginfo和待决理由.我可以突破第一个值,但无法弄清楚如何做第二个.到目前为止我的技能有限:

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'
Run Code Online (Sandbox Code Playgroud)

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

Job_Number  User_Assigned   PendingInfo   PendingWord       PendingInfo  PendingWord

1           User1           01            Not Enough Info   02           Not Enough Time
Run Code Online (Sandbox Code Playgroud)

提前致谢

pax*_*blo 5

如果您的SQL想要单独处理它们,那么您真的不应该在一列中存储多个项目.在这些情况下你必须执行的"SQL体操"既是丑陋的黑客又是性能下降.

理想的解决方案是将单个项目拆分为单独的列,对于3NF,如果您确实想要正确地将这些列移动到单独的表中(但如果您确定永远不会有婴儿步骤可能会好的话)短期中期有两个以上的原因).

然后您的查询将更简单,更快捷.


但是,如果这不是一个选项,你可以使用上述SQL体操来做类似的事情:

where find ( ',' |fld| ',', ',02,' ) > 0
Run Code Online (Sandbox Code Playgroud)

假设你的SQL方言有一个字符串搜索功能(find在这种情况下,但我认为charindex对于SQLServer).

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


如果你无法控制应用程序在该列中的内容,我会选择DBA解决方案 - DBA解决方案被定义为DBA必须做的工作来解决用户的不足之处:-).

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

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

这意味着拆分的成本仅在行插入/更新时,而不是在_every single select`上,分摊成本有效.


不过,我的答案是重新制作架构.就速度,可读查询和可维护性而言,这将是长期的最佳方式.


Ces*_*sar 5

我希望你只是维护代码,而不是一个全新的实现.
请考虑使用支持表使用不同的方法,如下所示:

JOBS TABLE
jobID | userID
--------------
1     | user13
2     | user32
3     | user44
--------------

PENDING TABLE
pendingID | pendingText
---------------------------
01        | Not Enough Info
02        | Not Enough Time
---------------------------

JOB_PENDING TABLE
jobID | pendingID
-----------------
1     | 01
1     | 02
2     | 01
3     | 03
3     | 01
-----------------
Run Code Online (Sandbox Code Playgroud)

您可以使用JOIN或子查询轻松查询此表.
如果您需要对软件进行复古兼容性,则可以添加视图以实现此目标.


Dwa*_*ley 2

如果更改架构一个选项(可能应该是),您不应该在此处实现多对多关系,以便在两个项目之间有一个桥接表吗?这样,您可以将号码及其措辞存储在一个表中,将作业存储在另一个表中,并将“作业失败原因”存储在桥接表中......