-1

このクエリをSQLServerで実行したいのですが、機能しませんでした:

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

どんな助けでも感謝されます

更新:OPコメントから追加:

libelleがnom1やnom2のように空でないかどうかを確認したいelse(libelleが空の場合)nom3のようにnom

4

4 に答える 4

6

私はそれがここに行く正しい方法だとは思わないcaseので、私はこれをもっと次のように見ています:

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

私には、これは読みやすく理解しやすいように思えます。クエリオプティマイザも同意するかもしれません。

于 2012-12-14T15:54:13.240 に答える
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

(他のオプションと非常によく似ています-特にTimのもの)

于 2012-12-14T16:28:50.170 に答える
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)

これにより、少なくとも正しい道を歩むことができます。

于 2012-12-14T17:48:59.713 に答える
1

構文は次のとおりです。

   CASE WHEN libelle != '' THEN Nom1
        WHEN libelle /* OTHER CONDITION HERE */ THEN Nom2
        ELSE Nom3
   END
于 2012-12-14T15:49:41.390 に答える