【问题标题】:Dynamic Select Query based on Query Column | SQL Server 2012基于查询列的动态选择查询 | SQL 服务器 2012
【发布时间】:2021-08-07 14:38:53
【问题描述】:

请问我们如何执行动态选择查询?

基本上我想要实现的是一个动态选择,它可以基于动态列选择查询,并且该动态列存在于表中。

示例表

Table Name: AppleBox
Table Columns: Apple101, Apple102, Apple103
Table Row: 
Apple101 = 1,2,3,4,5
Apple102 = 1,2,
Apple103 = 1

假设我将根据示例运行查询

SELECT apple+'$applecode' FROM AppleBox

$applecode 来自外部来源,并且 $applecode = 101,我的预期查询将是。

SELECT apple101 FROM AppleBox

有没有简单的方法来做到这一点?

【问题讨论】:

  • 您使用的是 MySQL 还是 MS SQL Server?
  • MS SQL Server,对造成的混乱表示歉意。
  • 使用动态 SQL。
  • 修复你的数据模型!您应该在表中有这样的列。相反,您应该有另一个表,其中每个值都有单独的行。
  • 我同意这里所说的,问题似乎出在设计上;解决这个问题,您可能遇到的问题不存在。

标签: sql sql-server sql-server-2012


【解决方案1】:

您可以使用case 表达式:

select (case when $applecode = 101 then apple101
             when $applecode = 102 then apple102
             when $applecode = 103 then apple103
        end) as apple
from t;

如果您的查询可以返回可变数量的列,或者如果您想设置列的名称,您将只需要动态 SQL(在这种情况下)。似乎都不重要。

【讨论】:

  • 会有办法吗?我很担心,因为如果要添加更多的苹果列,我们可能会继续扩展 SQL。 :(
  • @pjustindaryll 。 . .如果您只是向表中添加新列,则您的数据模型有问题。 这些应该存储在单独的行中。
【解决方案2】:

请检查以下代码。

CREATE TABLE [dbo].[AppleBox](
    [Apple101] [varchar](50) NULL,
    [Apple102] [varchar](50) NULL,
    [Apple103] [varchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[AppleBox] ([Apple101], [Apple102], [Apple103]) VALUES (N'1,2', N'1', N'1')
INSERT [dbo].[AppleBox] ([Apple101], [Apple102], [Apple103]) VALUES (N'3,4,5', N'1,2,', N'2')
INSERT [dbo].[AppleBox] ([Apple101], [Apple102], [Apple103]) VALUES (N'1,2,3,4,', N'1,2,3', N'3')
INSERT [dbo].[AppleBox] ([Apple101], [Apple102], [Apple103]) VALUES (N'1,2,3,4,5', N'1', N'4')


GO


DECLARE @query NVARCHAR(500)
DECLARE @exparam NVARCHAR(50)

SET @exparam='101'

SET @query='SELECT Apple'+@exparam+' FROM dbo.AppleBox'

EXECUTE sp_executesql  @query

【讨论】:

  • 如果Apple列被扩展了,有没有办法让它变成动态sql?
  • 我没有得到你的问题。这个@exparam 将是您的外部参数。它可以高达 123456789 .....(n 位),因为我们已将其作为 nvarchar(50) 长度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 2014-05-21
  • 2014-04-16
  • 2012-01-17
  • 2017-02-16
  • 1970-01-01
  • 2019-06-10
相关资源
最近更新 更多