如何使用数组通过参数按自定义顺序进行查询?

时间:2019-03-29 03:47:11

标签: sql-server django python-3.x

我有一种算法,可以按特定顺序输出数组。示例:

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这样的东西。干杯。

1 个答案:

答案 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相比,性能可能会更差。