【问题标题】:If or Case within a dynamic where clause动态 where 子句中的 If 或 Case
【发布时间】:2013-02-06 21:02:21
【问题描述】:

在 SQL Server 2008 上,我有一个变量 @storename,它是一个 varchar(20) 和这个语句:

SET @query = 'select '+@result1+' '+@colsNull+' into ##tempz 
FROM
(SELECT '+@result2+'
FROM rpPay p LEFT JOIN RPTrs r ON p.ReceiptNo = r.receiptno LEFT JOIN Currencies c ON LEFT(p.paytype,1) = c.POSCurrency
WHERE r.trsdate >= '''+ convert(varchar(10), @startDate, 101) +''' 
AND r.trsdate <= '''+ convert(varchar(10), @endDate, 101) +''' 
) p
pivot
(sum(amount) FOR CurrencyDesc in('+@cols+')) piv'
execute(@query)

我正在尝试将 where 子句设置为所有 StoreID 或 @storename 所具有的内容。我可以在那里有一个 IF 或 case 语句或类似的东西

and r.StoreID = * or r.StoreID = @storename

在where子句中使用通配符有这种事吗?

就目前而言,我已经尝试过:

declare @storename varchar(20)
set @storename = '01'

and ('+@storename+' is null or r.storeId = '+@storename+') -- Error : Conversion failed when converting the varchar value 'BK' to data type int.
and r.StoreID like '+@storename+' -- Returns no information, just blank table

也试过了

declare @storename varchar(20)
set @storename = '01'
and r.storeid = '''+@storename+'''

哪个有效,只从商店 01 返回所有东西,但如果我放了

set @storename = null -- Gives me invalid Object name for the temp table I'm using
set @storename = '' -- give back no results again, just empty table

【问题讨论】:

  • ##tempz?您能解释一下全局临时表的用例吗?您是否会遇到两个人同时尝试执行此代码的情况?

标签: sql sql-server-2008 if-statement case


【解决方案1】:

不,但你可以试试:-

AND ( @storename IS NULL OR r.StoreID = @storename )

【讨论】:

  • 使用 and ('+@storename+' 为 null 或 r.storeId = '+@storename+') 我收到此错误:将 varchar 值 'BK' 转换为数据类型 int 时转换失败。 @storename 是 varchar(20) 而不是 int
  • @JohnZ:你说你想要r.StoreID = @storename作为条件的一部分
  • @AndriyM - 是的,在数据​​库中,storeid 可以是 01 或 XC,这取决于客户如何称呼他们的商店。我的目标是运行选择它选择所有商店的选择或他们输入的特定名称
  • @JohnZ:有些不对劲。您之前提到的错误消息清楚地表明 storeid 是一个 int。那么它如何存储XC 之类的东西呢?我怀疑您遇到的问题与您所描述的问题之间存在差距。我的意思是,似乎缺少一些重要信息。
  • @JohnZ: 顺便说一下 '... and ('+@storename+' is null ...' 不起作用,因为 NULL 不会连接。这必须用动态 SQL?
【解决方案2】:

r.storeId = '+@storename+')

storeId 是一个 int,@storename 是一个 varchar,所以你不能比较它们。

and r.StoreID like '+@storename+'

storeID 是一个 int,所以你不能对它做 LIKE。

您可能需要将 @storename 转换为 int 或重构您的数据库,以便 StoreID 是 varchar,因此它们匹配。

【讨论】:

    【解决方案3】:

    让它与

    一起工作

    和 r.storeid 类似 ''%'+@storename+'%''

    【讨论】:

      【解决方案4】:

      您可以使用NULL 代替@storename 来表示“所有记录”。

      declare @storenameComparisonValue varchar(50)
      set @storenameComparisonValue =
              isnull(cast(replace(@storename, '''', '''''') as varchar(50)), 'null')
      ' ... and (' + @storenameComparisonValue + ' is null or r.StoreID = '''
              + @storenameComparisonValue + ''')
      

      【讨论】:

      • 尝试了更新的帖子,仍然给我: 将 varchar 值 'BK' 转换为数据类型 int 时转换失败。
      • @JohnZ:然后,正如 Andriy M 所建议的,StoreID 似乎是一个int,而@storename 包含'BK'。您无法将 'BK'int 进行比较。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多