Tsql 筛选数据库表的任何列客户端T-SQL select from case when then where
我希望能够通过datagrid的列进行筛选,但不知道如何修复select语句这是我所能做到的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
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'附近的语法不正确”