将数组传递给SQL以返回相同的数组大小并重新排序

时间:2018-10-15 20:27:22

标签: sql sql-server

美好的一天。我有一张桌子。我正在尝试使用Visual Basic将数组传递到sql。我正在执行我的查询,该查询现在是静态列表,它返回正确的行数,但是它扭曲了数据集顺序。

如果一条记录不存在,则case语句返回0。如果存在,则返回部件号。问题在于,它会将数据集按无序排列,列出了最先存在的数据集和未持续存在的数据集。

如何对将返回其进来顺序的值数组执行case语句?非常感谢您的帮助。谢谢。

1   1001
2   1002
3   1003
4   1004
5   1005
6   1006

我的查询

SELECT pkid AS listNum, 
       PartNumber = CASE 
                      WHEN partnumber IN ( 1001, 3, 1003 ) THEN partnumber 
                      ELSE 0 
                    END 
FROM   bindata 

不良结果

1   1001
2   1003
3   0

所需结果

1   1001
2   0
3   1003

3 个答案:

答案 0 :(得分:1)

一种选择是传递定界字符串并执行LEFT JOIN

示例

Declare @Search varchar(max) = '1001, 3, 1003 '

Select A.RetSeq
      ,Value  = isnull(partnumber,0)
 From  (
         Select RetSeq = Row_Number() over (Order By (Select null))
               ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
         From  (Select x = Cast('<x>' + replace(@Search,',','</x><x>')+'</x>' as xml).query('.')) as A 
         Cross Apply x.nodes('x') AS B(i)
       ) A
 Left Join  YourTable  B
  on  A.RetVal=B.partnumber
 Order By RetSeq

返回

RetSeq  Value
1       1001
2       0
3       1003

答案 1 :(得分:1)

您需要的是一个字符串分隔符,该分隔符使用一种编号系统,该编号系统使用行号来维护数组项的原始位置。 Jeff Moden's DelimitedSplit8K是一个很好的例子...

假设您具有DelimitedSplit8K函数,则查询看起来像这样...

getAllArticlesOfPolitician(req) {
  return Article.findAll({
    include: [{
      model: Politician,
      as: 'politicians',
      through: 'polit_in_article',
      where: {
        lastname: req.query.politicianLastName,
      },
    }],
  })
  .then(response => response)
  .catch(err => err);
}

如果由于某种原因您无法或不允许添加上述功能,则可以不使用它来完成,但确实会使代码稍微复杂一些...

DECLARE @array VARCHAR(100) = '1001, 3, 1003';

WITH
    cte_split_array AS (
        SELECT 
            dsk.ItemNumber,
            partnumber = CONVERT(INT, dsk.Item)
        FROM
            dbo.DelimitedSplit8K(@array, ',') dsk
        )

SELECT 
    partnumber = ISNULL(bd.partnumber , 0)
FROM
    cte_split_array sa
    LEFT JOIN dbo.bindata bd
        ON sa.partnumber = bd.partnumber
ORDER BY 
    sa.partnumber;

答案 2 :(得分:0)

以某种方式必须在查询之前保留数组的顺序,在运行实际查询之前,可以创建一个临时表: ordered_array: row_number pkid

,然后将结果与ordered_array结合在一起,并按行号进行排序。