我需要做一個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