Tsql 筛选数据库表的任何列客户端T-SQL select from case when then where

Tsql 筛选数据库表的任何列客户端T-SQL select from case when then where,tsql,syntax,sql-server-2014,Tsql,Syntax,Sql Server 2014,我希望能够通过datagrid的列进行筛选,但不知道如何修复select语句这是我所能做到的 SELECT ClientID, FirstName, LastName, BirthDate, StreetName, City, State, ZipCode, CellPhone FROM dbo.Client CASE WHEN @ColumnName = 'ClientID' THEN WHERE @ColumnName = @Filter END CASE

我希望能够通过datagrid的列进行筛选,但不知道如何修复select语句这是我所能做到的

SELECT 
    ClientID, FirstName, LastName, BirthDate, StreetName, 
    City, State, ZipCode, CellPhone 
FROM 
    dbo.Client 
CASE WHEN @ColumnName = 'ClientID' THEN WHERE @ColumnName = @Filter END
CASE WHEN @ColumnName = 'FirstName' THEN WHERE @ColumnName LIKE @Filter END 
CASE WHEN @ColumnName = 'LastName' THEN WHERE @ColumnName LIKE @Filter END 
CASE WHEN @ColumnName = 'BirthDate' THEN WHERE @ColumnName = @Filter END 
CASE WHEN @ColumnName = 'StreetName' THEN WHERE @ColumnName LIKE @Filter END 

CASE WHEN @ColumnName = 'City' THEN WHERE @ColumnName LIKE @Filter END 
CASE WHEN @ColumnName = 'State' THEN WHERE @ColumnName LIKE @Filter END 
CASE WHEN @ColumnName = 'ZipCode' THEN WHERE @ColumnName LIKE @Filter END  
CASE WHEN @ColumnName = 'CellPhone' THEN WHERE @ColumnName LIKE @Filter END;

感谢您抽出时间

您应该尝试在where子句中引用实际列,因为@ColumnName包含name,而不是引用列值。通过“WHERE@ColumnName=@Filter”,我们比较列的名称。通过“WHERE ClientID=@Filter”,我们比较列的值。也许,你应该这样做:

SELECT ClientID, FirstName, LastName, BirthDate, StreetName, City, State, 
ZipCode, CellPhone 
FROM dbo.Client 
CASE 
  WHEN @ColumnName = 'ClientID' THEN ClientID
  WHEN @ColumnName = 'FirstName' THEN FirstName
  WHEN @ColumnName = 'LastName' THEN LastName 
  WHEN @ColumnName = 'BirthDate' THEN BirthDate
  WHEN @ColumnName = 'StreetName' THEN StreetName
  WHEN @ColumnName = 'City' THEN City
  WHEN @ColumnName = 'State' THEN State
  WHEN @ColumnName = 'ZipCode' THEN ZipCode
  WHEN @ColumnName = 'CellPhone' THEN CellPhone
END
LIKE '%' + @Filter + '%';

我认为
中的
在这里更干净

SELECT ClientID, FirstName, LastName, BirthDate, StreetName, City, State, 
       ZipCode, CellPhone 
FROM dbo.Client  
where (@ColumnName = 'ClientID'  and ClientID     = @Filter) 
   or (@ColumnName = 'FirstName' and FirstName LIKE @Filter)
   or (@ColumnName = 'LastName'  and LastName  LIKE @Filter) 
...;

尝试此查询:

SELECT ClientID, FirstName, LastName, BirthDate, StreetName, City, State, 
ZipCode, CellPhone 
FROM dbo.Client 
WHERE 
CASE WHEN @ColumnName = 'ClientID' AND ClientID = @Filter THEN 1
WHEN @ColumnName = 'FirstName' AND FirstName LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = 'LastName' AND LastName LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = 'BirthDate' AND CASE WHEN ISDATE(@Filter) = 1 THEN CONVERT(DATETIME, @Filter, 101) ELSE NULL END = BirthDate THEN 1
WHEN @ColumnName = 'StreetName' AND StreetName LIKE '%' + @Filter + '%' THEN 1

WHEN @ColumnName = 'City' AND City LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = 'State' AND State LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = 'ZipCode' AND ZipCode LIKE '%' + @Filter + '%' THEN 1 
WHEN @ColumnName = 'CellPhone' AND CellPhone LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = '' THEN 1
ELSE 0
END = 1
查询说明:

SELECT ClientID, FirstName, LastName, BirthDate, StreetName, City, State, 
ZipCode, CellPhone 
FROM dbo.Client 
WHERE 
CASE WHEN @ColumnName = 'ClientID' AND ClientID = @Filter THEN 1
WHEN @ColumnName = 'FirstName' AND FirstName LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = 'LastName' AND LastName LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = 'BirthDate' AND CASE WHEN ISDATE(@Filter) = 1 THEN CONVERT(DATETIME, @Filter, 101) ELSE NULL END = BirthDate THEN 1
WHEN @ColumnName = 'StreetName' AND StreetName LIKE '%' + @Filter + '%' THEN 1

WHEN @ColumnName = 'City' AND City LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = 'State' AND State LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = 'ZipCode' AND ZipCode LIKE '%' + @Filter + '%' THEN 1 
WHEN @ColumnName = 'CellPhone' AND CellPhone LIKE '%' + @Filter + '%' THEN 1
WHEN @ColumnName = '' THEN 1
ELSE 0
END = 1
  • 当您传递与任何记录和每个列名匹配的任何列名和筛选器时,它将返回这些记录
  • 当列名匹配且没有记录与每个列名匹配时,它会返回到最后一个
    部分,因此不会按预期返回任何记录
    
  • 除了
    ClientID
    BirthDate
    之外的所有过滤器都有通配符语法,这将有助于部分匹配
  • 在一种特殊情况下,当您不提及任何列名,即
    @ColumnName='
    时,所有行都将返回,因为您不想进行筛选。当@ColumnName=''然后是1时,可以通过删除此行
    轻松更改此附加行为

像你这样使用
是没有用的。除非你传递了一些意想不到的变量。你可以像“%+@Filter+'%%”那样使用
@AndreyKaplun-你是否像BJones提到的那样在
@Filter
中传递
%
?@BhavinGosai是的,我看一下。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,
tsql
缩小了选择范围,但没有指定database.SqlException“操作数类型冲突:日期与int不兼容”@andrey kaplun-您的
@Filter
的值是多少?
Filter
的值是2,而
ColumnName
@andrey kaplun的值是ClientID-我现在已经根据您的输入更新了查询。请现在试一试。让我知道它是否适用于您。SqlException“关键字'Case'附近的语法不正确”