2010-09-06 37 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兼容的優勢。

相關問題