对where子句中的列名使用'LIKE'

时间:2011-12-23 14:49:24

标签: sql sql-server sql-server-2008 sql-server-2005 tsql

我开始看一下以下问题:https://stackoverflow.com/questions/8616458/sql-query-like-clarification

不幸的是,原来的问题似乎有点不清楚,但我决定解释这个问题,因为当模式中的某些列符合他的条件时,他试图仅运行查询。很可能这不是被问到的,但是我想挑战自己这样做(作为一个新问题发布,因为原来不清楚,很可能被删除,很可能与此无关)。

我得到的是以下内容:

select 
       [OrderID]
      ,[ProductID]
      ,[UnitPrice]
      ,[Quantity]
      ,[Discount]
from [Northwind].[dbo].[Order Details]
where
    (
        select top 1
                COLUMN_NAME
        from    INFORMATION_SCHEMA.columns
        where   COLUMN_NAME like '%ProductID'
    ) like '%ProductID'

我知道这在语法上是多么荒谬但是我把它放在这里是为了让你知道我的思维过程在哪里,并且也希望基于此,我可以得到关于更好的只运行方法的反馈当数据库中的列与您指定的条件匹配时的查询?我在任何地方都没有看到任何目的 - 我只是好奇并认为我可以从中吸取教训。

2 个答案:

答案 0 :(得分:4)

在SQL中,列引用必须是固定的,并且在编写查询时已知有效。在查询开始执行后,事后证明列名称无效是不合法的。

@Igor给出的解决方案通过运行两个查询来解决这个问题,第一个是测试系统表,然后有条件地运行第二个查询。您不能在一个查询中同时执行这两项操作。

答案 1 :(得分:3)

如果我理解正确,您可以使用系统视图sys.columns

来完成
IF EXISTS (SELECT 1 FROM sys.columns WHERE name LIKE '%ProductID')
SELECT *
FROM [Northwind].[dbo].[Order Details]