2

これは悪い考えかもしれませんが、ただ疑問に思っていますか?

;with Products
AS
(
/* can you have an if statement in here? */
select * from products

/* or */

select * from products 
where condition

)

私が考えているのは、検索文字列がある場合とない場合があるということです。cteでそれをどのように考慮しますか?

それとも、1 つの手順で 2 つの cte を使用する方がよいでしょうか?

4

2 に答える 2

5

検索文字列をパラメーターとして渡す場合、1 つのステートメントでそれが null であるか、すべてではないかを確認できます。例えば:

select *
from MyTable
where MyColumn = @SearchString
    or @SearchString is null;

これにより、パラメーターが null でない場合は一致するレコードが返され、null の場合はすべてのレコードが返されます。

case別のオプションとして、いつでもwhere 句にステートメントを入れることができます。

それを超えて、本当に別のクエリが必要な場合は、確かに分岐できますがif、クエリは CTE を宣言した直後のステートメントでなければなりません。したがって、if ステートメントの各ブランチにコピーまたは CTE とクエリを含める必要があります。

where句全体を渡して動的SQLとして実行することを考えている場合(編集:ORMタイプのsp_executesqlではなく、パラメータ化されていない連結文字列を意味します)、最初に上記の方法のいずれかを使用するようにリファクタリングを試みます。動的 SQLには固有の問題があります。動的 SQL は、多くの場合、最初は巧妙で洗練されたものに見えますが、他のオプションがどういうわけか悪いことが判明した場合にのみ、最後の手段として見なされることが多いです。

于 2012-11-03T15:26:01.317 に答える
1

table 変数も役立つ場合があります。それが役立つかどうかを確認してください..

DECLARE @tbl TABLE(id int,name varchar(500), .... )

if <@booleanexpression = 1> INSERT INTO @tbl select * from products else INSERT INTO @tbl select * from products where condition..

cte as ( select * from @tbl )

select * from cte

于 2015-04-10T12:30:48.833 に答える