2012-12-14 44 views
-1

我想執行的SQL Server此查詢,但沒有奏效:使用「的情況下」有「或」在where子句中

Select Nom from tab 
    WHERE 
Nom LIKE 
CASE WHEN libelle !='' then 
    Nom1 
OR 
Nom2 
else 
Nom3 
end 

任何幫助時便會明白

更新:新增從OP評論:

我想驗證是否libelle不是空的NOM像NOM1或類似其他NOM2(如果libelle爲空)NOM像nom3

+2

「不行」的任何定義將不勝感激。 –

+7

這裏的OR是什麼意思?我讀它的方式沒什麼意義。 – Oded

+1

你能解釋你在這裏想要做什麼嗎? 'CASE'聲明沒有多大意義。也許發佈一些數據,然後期望的結果將有所幫助 – Taryn

回答

6

我不覺得case是去這裏的正道,所以我看到這是更喜歡:

select Nom 
from tab 
where (
    libelle != '' 
    and (
     Nom like Nom1 
     or Nom like Nom2 
    ) 
) 
or (
    libelle = '' 
    and Nom like Nom3 
) 

對我來說,這似乎更易於閱讀和理解。查詢優化器甚至可能同意。

1

語法是:

CASE WHEN libelle != '' THEN Nom1 
     WHEN libelle /* OTHER CONDITION HERE */ THEN Nom2 
     ELSE Nom3 
    END 
+0

問題是它不是其他條件,它是一樣的 – user1805523

+0

@ user1805523 - 你是什麼意思「它是同一個」?當'libelle!=''''時你想要返回'Nom1'和'Nom2'嗎? – Oded

+0

就像@ user1805523說的。你什麼意思?你是什​​麼意思「Nom1 OR Nom2」呢? –

3
SELECT Nom 
FROM tab 
WHERE 
    1 = CASE 
     WHEN libelle != '' AND (Nom like Nom1 OR Nom like Nom2) THEN 1 
     WHEN libelle = '' AND Nom like Nom3 THEN 1 
     ELSE 0 
     END 

(非常類似於其他的選擇 - 尤其是蒂姆的)

+0

謝謝你的工作 – user1805523

+0

+1好的翻譯到開關。 –

3

所以你要做的動態SQL的話,我不相信你可以做到這一點很喜歡與一個case語句,此可以工作雖然:

declare @sql nvarchar(100) 
declare @libelle nvarchar(20) 
--Set @libelle to something (can be via a query, or a stored proc parameter etc rather than just a string like here 
set @libelle = '' 
set @sql = 'SELECT Nom FROM tab WHERE Nom LIKE' 

IF @libelle = '' 
    SET @sql = @sql + ' ''Nom3''' 
ELSE 
    SET @sql = @sql + ' ''Nom1'' OR Nom LIKE ''Nom2''' 
EXEC (@sql) 

這應該至少讓你在正確的道路上。

+0

我不確定我是否理解需要跳轉到使用過程和動態SQL來執行此操作。另外,你不需要多次運行(可能是每行)並將結果聯合起來,因爲'libelle'實際上是'tab'表中的一列,並且看起來不是一個變量? –

相關問題