我有一种算法,可以按特定顺序输出数组。示例:
arr = [0, 1, 21, 2, 22, 23, 24, 25, 3, 27, 35, 36, 28, 37, 38, 4, 29, 5, 34, 6, 7, 8, 9, 10, 11, 12]
该数组将根据用户的输入而有所不同,因此上面的示例只是许多未定义的可能性之一;更长,更短或不同的值(所有值都是整数)。因此,我将无法在查询中使用case
。
我想在我的 views.py 中生成一个SQL Server查询,以按照确切的顺序显示模型中的所有对象。
此刻是我的“查询”,但显然不起作用。
test = QuoteAssemblies.objects.raw("""SELECT qmaQuoteAssemblyID,
qmaPartID,
qmaLevel,
qmaPartShortDescription,
qmaQuantityPerParent
FROM QuoteAssemblies
WHERE qmaQuoteAssemblyID IN arr
ORDER BY qmaQuoteAssemblyID = arr""")
本质上,我希望查询按qmaQuoteAssemblyID
进行排序,只要它与数组的顺序相同(而不是ASC,DESC等)即可。
qmaQuoteAssemblyID = 0
qmaQuoteAssemblyID = 1
qmaQuoteAssemblyID = 21
qmaQuoteAssemblyID = 2
etc...
MySQL Here也有类似的例子。我只需要像MSSQL这样的东西。干杯。
答案 0 :(得分:2)
如果您的SQL Server版本支持JSON查询(即2016年以上),则可以使用[] | [number, number]
函数对数组元素进行编号,然后使用该数字进行排序:
openjson()
如果您不能使用JSON来完成此任务,则需要以某种方式生成一个行集,并为您的数组元素正确编号,并以类似的方式使用它。有很多方法可以实现此目的,并且不一定必须在服务器端完成。例如,您可以在数据库中创建2列declare @Arr nvarchar(max) = '[0, 1, 21, 2, 22, 23, 24, 25, 3, 27, 35, 36, 28, 37, 38, 4, 29, 5, 34, 6, 7, 8, 9, 10, 11, 12]';
SELECT q.qmaQuoteAssemblyID,
q.qmaPartID,
q.qmaLevel,
q.qmaPartShortDescription,
q.qmaQuantityPerParent
FROM dbo.QuoteAssemblies q
inner join openjson(@Arr) ar on ar.[value] = q.qmaQuoteAssemblyID
ORDER BY ar.[key];
用户定义的表类型,并将数据作为查询的参数提供。
另一种方法是以XML形式提供数据,如下所示:
key-value
不过,XML节点的编号最好由应用程序完成,因为在数据库端没有有效的方法可以做到这一点。这样,与选项1相比,性能可能会更差。