【问题标题】:SQL Server - Using Combined Column in WHERE ClauseSQL Server - 在 WHERE 子句中使用组合列
【发布时间】:2018-06-01 22:02:15
【问题描述】:

我在 WHERE 子句中使用组合列时遇到问题。我正在尝试合并两列并执行 WHERE x IN (a,b,c) 来过滤行。

这是我的数据:

Tag      Param
------   -----
TI-123   LL
TI-123   LO
FI-321   LO
FI-321   BAD

这是我正在尝试的:

SELECT [Tag] + '.' + [Param] AS 'TagParam' 
   FROM Tags
   WHERE 'TagParam' IN ('TI-123.LL', 'TI-123.LO')

结果永远不会匹配 WHERE 子句并且总是空的。我可以将行分开并使用带有大量 AND 和 OR 的 WHERE,但它更难阅读。我将在 IN() 语句中包含大约 100 个项目。

【问题讨论】:

    标签: sql tsql sql-server-2012


    【解决方案1】:

    您不能在对应的WHERE 中使用SELECT 中定义的表别名。在事物周围加上单引号只会混淆问题,将事物变成字符串常量。

    重复表达式:

    SELECT ([Tag] + '.' + [Param]) AS TagParam
    FROM Tags
    WHERE ([Tag] + '.' + [Param]) IN ('TI-123.LL', 'TI-123.LO');
    

    如果您不想重复表达式,可以使用子查询、CTE 或横向连接(apply 关键字)。但是你的表达方式很简单。

    【讨论】:

    • 谢谢。我想我现在明白了。那么在 WHERE 子句中使用列别名的唯一方法是首先将其作为实际列名返回?
    • @Ken。 . .没错。
    • @GordonLinoff.. 让我回答一些问题.. 哈.. .. 只是为了好玩.. 超级
    【解决方案2】:

    我会这样写

    SELECT [Tag] + '.' + [Param] AS 'TagParam' 
    FROM Tags
    WHERE Tag = 'TI-123'
      AND Param IN ('LL', 'LO')
    

    这使它成为 sargable(可以使用索引)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      相关资源
      最近更新 更多