美好的一天。我有一张桌子。我正在尝试使用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
答案 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结合在一起,并按行号进行排序。