2

値をストアド プロシージャに渡して、OR ステートメントを SQL SELECT ステートメントに追加するかどうかを指定することはできますか?

私はそのようなことを試みましたが、それは有効ではありません:

SELECT xyzName
FROM xyz_fields
WHERE (xyzType = 'this') UNION ALL
(if @status=1 OR (xyzType = 'that')) UNION ALL
(if @status2=1 OR (xyzType = 'somethingelse'))

アプリケーションから DB に再度アクセスするのではなく、SQL で WHERE 句を作成するようなものですか?

4

3 に答える 3

4

次のような意味だと思います。

SELECT xyzName
FROM xyz_fields
WHERE (xyzType = 'this') 
OR (@status=1 AND (xyzType = 'that')) 
OR (@status2=1 AND (xyzType = 'somethingelse'))

where 句の 2 行目は、@status が 1 に等しく、xyzType が 'that' に等しい場合にのみ成功を返します。

于 2013-05-21T12:51:30.180 に答える
2

これには動的 SQL を使用できます。

declare @SqlQuery varchar(100)

Set @SqlQuery = ' SELECT xyzName FROM xyz_fields WHERE  xyzType = ''this'' '

if(@status=1)
Set @SqlQuery = @SqlQuery + ' OR xyzType = ''that'' '

if(@status2=1)
Set @SqlQuery = @SqlQuery + ' OR xyzType = ''somethingelse'''

exec(@SqlQuery) 

クエリ内の単一の qoutes は、別の単一の qoute を前に付けることでエスケープされます。だからクエリで

WHERE  xyzType = 'this' 

する必要があります

WHERE  xyzType = ''this''
于 2013-05-21T12:51:08.627 に答える
1
SELECT xyzName
FROM xyz_fields
WHERE (xyzType = 'this')
OR ((xyzType = 'that') AND @status = 1)
OR ((xyzType = 'somethingelse') AND @status2 = 1)

When@status = 1は を((xyzType = 'that') AND @status = 1)返します(xyzType = 'that')が、 when@status = 0((xyzType = 'that') AND @status = 1)戻りfalse、クエリには影響しません。

于 2013-05-21T12:59:19.797 に答える