Sql检查字符串数组中的多个值

时间:2015-10-12 15:13:35

标签: sql-server stored-procedures

我要做的是我有一个包含1个或更多值的字符串数组。当我将这些值传递给sql时,我试图检查每个值上的一个字段,如果它包含pass或fail。我能够一对一地做到这一点。但现在要求是需要同时检查多个值或ID。我真的不确定从哪个开始。大多数文章建议将信息存储在表格中。由于部分数据已经失败,因此排名前1的原因。所以我正在寻找最近的失败者

这是检查一个ID的SQL:

declare @PTSID nvarchar(1000) = '7VD6GSZG, 8V9WKX78, DOJUSEM8'

但是说我有类似的东西

p_id      |   insp_status
7VD6GSZG      fail
8V9WKX78      fail
DOJUSEM8      pass

如何检查列检查状态的每个ID? 所以理想情况下,我喜欢像

这样的东西
import sys
try:
    # Program here
except KeyboardInterrupt:
    # Close connections
    sys.exit(0)

2 个答案:

答案 0 :(得分:1)

创建一个函数将字符串更改为表格,如下所示:

CREATE FUNCTION [dbo].[function_string_to_table]
(
    @string VARCHAR(MAX),
    @delimiter CHAR(1)
)
RETURNS @output TABLE(
    data VARCHAR(256)
)
BEGIN

    DECLARE @start INT, @end INT
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)

    WHILE @start < LEN(@string) + 1 BEGIN
        IF @end = 0 
            SET @end = LEN(@string) + 1

        INSERT INTO @output (data) 
        VALUES(SUBSTRING(@string, @start, @end - @start))
        SET @start = @end + 1
        SET @end = CHARINDEX(@delimiter, @string, @start)
    END

    RETURN

END

然后像这样加入你的桌子:

declare @PTSID nvarchar(1000) = '7VD6GSZG, 8V9WKX78, DOJUSEM8'

select *, CASE WHEN CHECKT.data is null THEN 'false' ELSE 'true' END as dataExists 
from Insp_Results  R 
LEFT JOIN [dbo].[function_string_to_table](@PTSID, ',') CHECKT ON CHECKT.data = R.RESV_PTSID

答案 1 :(得分:-2)

您可以使用SQL IN条件。语法为:

    expression IN (value1, value2, .... value_n);

所以在你的情况下它可能是这样的:

    declare @PTSID = nvarchar(1000);
    SET @PTSID = '7VD6GSZG, 8V9WKX78, DOJUSEM8';
    Select top (1)
    p_id,   
    insp_status 
    from Insp_Results   
    where RESV_PTSID IN @PTSID
    order by RESD_DATE desc