我需要做一个DB选择将表现不同输入数字或文字时,应使用只是不同的条件。我认为它应该完成,但不太清楚语法(MSSQL)。谢谢SQL - SELECT * FROM X WHERE(如果值是数字,否则......)
我需要:
SELECT *
FROM X
WHERE (IF value passed is numeric = "ID" ELSE "NAME") = Value //ID or Name are columns
我需要做一个DB选择将表现不同输入数字或文字时,应使用只是不同的条件。我认为它应该完成,但不太清楚语法(MSSQL)。谢谢SQL - SELECT * FROM X WHERE(如果值是数字,否则......)
我需要:
SELECT *
FROM X
WHERE (IF value passed is numeric = "ID" ELSE "NAME") = Value //ID or Name are columns
这是一种方法,但你的问题是一丁点含糊
WHERE
CASE ISNUMERIC(Something) WHEN 1 THEN x ELSE Y END
两种方式:
使用或
select ..
from tablename
where (something = clause1 and isnumeric(value) = 1)
or (something = clause2 and isnumeric(value) <> 1)
或者usi NG工会
select ..
from tablename
where something = clause1 and isnumeric(value) = 1
union all
select ..
from tablename
where something = clause1 and isnumeric(value) <> 1
简单 - 获取数值:
SELECT [columns] FROM X WHERE ISNUMERIC(value) = 1
更复杂:
SELECT [columns] FROM X WHERE CASE ISNUMERIC(value) WHEN 1 THEN [something] ELSE [something_else] END
根据您的例子:
SELECT *
FROM TABLE X
WHERE (CASE
WHEN ISNUMBERIC(@parameter_value) = 1 THEN x.id
ELSE x.name
END) = @parameter_value
...会工作,我想强调这个方法是not sargable - 它表现不如它应该。
如果用一个单一的参数处理,使用IF ELSE将有更好的表现:
IF ISNUMERIC(@parameter_value) = 1
BEGIN
SELECT x.*
FROM TABLE x
WHERE x.id = @parameter_value
END
ELSE
BEGIN
SELECT x.*
FROM TABLE x
WHERE x.name = @parameter_value
END
另一种方法(其一定要如果处理一个以上的过滤器标准来考虑)是使用动态SQL。我建议你阅读The curse and blessings of dynamic SQL看此SQL Server 2005+例如前:
DECLARE @paramater_value NVARCHAR(255)
DECLARE @SQL NVARCHAR(4000)
SET @SQL = 'SELECT x.*
FROM TABLE x '
SET @SQL = @SQL + CASE
WHEN ISNUMBERIC(@paramater_value) = 1 THEN
' WHERE x.id = @paramater_value '
ELSE
' WHERE x.name = @paramater_value '
END
BEGIN
EXEC sp_executesql @SQL,
N'@paramater_value NVARCHAR(255)',
@paramater_value
END
我假设有码的地方,构建该查询,并将其发送到数据库?为什么不让该代码确定该值是否为数字并生成适当的查询?它使查询更清晰,并且具有与几乎每个地球上的RDBMS兼容的优势。
ISNUMERIC()返回1或0 - 你需要一个明确的比较的WHERE这样子句中使用它。 – 2010-09-06 17:51:14
好的,给你Dylan +1 – 2010-09-06 17:58:04