2010-09-06 122 views

回答

0

这是一种方法,但你的问题是一丁点含糊

WHERE 
    CASE ISNUMERIC(Something) WHEN 1 THEN x ELSE Y END 
0

两种方式:

使用或

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 
+0

ISNUMERIC()返回1或0 - 你需要一个明确的比较的WHERE这样子句中使用它。 – 2010-09-06 17:51:14

+0

好的,给你Dylan +1 – 2010-09-06 17:58:04

0

简单 - 获取数值:

SELECT [columns] FROM X WHERE ISNUMERIC(value) = 1 

更复杂:

SELECT [columns] FROM X WHERE CASE ISNUMERIC(value) WHEN 1 THEN [something] ELSE [something_else] END 
3

根据您的例子:

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 
3

我假设有码的地方,构建该查询,并将其发送到数据库?为什么不让该代码确定该值是否为数字并生成适当的查询?它使查询更清晰,并且具有与几乎每个地球上的RDBMS兼容的优势。

相关问题