8

ある変数の値に応じて、クエリをエレガントに短縮できるのではないかと思います。

例:名前の付いた値が$var = 0あり、次のようなクエリを送信したいと思います。

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100";

しかし、$ var!= 1の場合、次のようなクエリを送信したいと思います。

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100 AND id = '$var'";

したがって、$ varの値に応じて、クエリの1つを実行します。最後の表現だけが違います。私は2つの可能な解決策を見つけましたが、それらはエレガントではなく、私はそれらをまったく好きではありません。

1つはphpで作られています:

if ( $var == 0 ) {
  $query_without_second_expression
} else {
  $query_with_second_expression
}

2番目はmysqlで作成されます:

SELECT WHEN '$var' <> 0 THEN id, name, quantity 
FROM products WHERE quantity > 100 AND id = '$var' ELSE id, name, quantity 
FROM products WHERE quantity > 100 END

しかし、私はそれが好きではありません-それぞれのアイデアは、いくつかの理由でクエリを2倍にします。このようなことはできますか?

SELECT id, name, quantity 
FROM products WHERE quantity > 100 
CASE WHEN $var <> 0 THEN AND id = '$var' 

これははるかに短く、必要に応じてクエリの一部を追加します。もちろん、実際のクエリははるかに複雑であり、より短いステートメントが実際に期待されます。誰かアイデアがありますか?

4

9 に答える 9

5

よく理解できれば…

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100";
if ( $var != 0 ) {
  $query .= " AND id = '$var'";
}

あなたはそれが好きですか?

于 2012-04-10T14:25:38.107 に答える
2

SQL側では次のようにすることができます。

"SELECT id, name, quantity FROM products WHERE quantity > 100 AND (id = '$var' OR '$var' = 0) 

ただし、パフォーマンスに影響を与える可能性があります。PHP側で適切なクエリを作成することをお勧めします。

于 2012-04-10T14:27:37.173 に答える
1

追加のwhereステートメントのみが異なる場合は、おそらくPHPにとどまり、次のことを行います。

$conditions = array();
$conditions[] = "(quantity > 100)"

if ($var == 0)
  $conditions[] = "(id = '$var')";

if (some-other-expression)
  $conditions[] = "(myfield = 'foo' OR myfield = 'bar')";

$sql = "
  SElECT id, name, quantity
  FROM products
  WHERE
";
$sql .= $conditions.join(" AND ");

/カルステン

于 2012-04-10T14:25:53.820 に答える
1

私はPHP開発者ではありませんが(PHPですよね?)、連結された文字列からクエリを作成するのが最も簡単ではないでしょうか。

擬似コード:

$my_query = "SELECT id, name, quantity FROM products WHERE quantity > 100"

if ($var != 1)
   $my_query = $my_query + " AND id = '$var'";
end if;

/*go ahead with your query*/
于 2012-04-10T14:26:09.823 に答える
1

あなたはこれを行うことができます:

SELECT id, name, quantity 
FROM products 
WHERE  1 = 1
       AND ( $q   IS NULL OR quantity > $q)
       AND ( $var IS NULL OR id = $var)

最初の条件のみを実行してから合格する場合$q = 100$var = NULL、2番目の条件は無視されます。そして、2番目のクエリに対してとを渡す$q = 100と、2番目のクエリ$var = id valueが取得されます。

于 2012-04-10T14:26:09.980 に答える
1

私はこれに三元を使用します:

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100" . ( $var != 0 ? " AND id = '$var'" : '' );
于 2012-04-10T14:28:45.480 に答える
1

私はOracleの人ですがIF()、制約で関数を使用できますか?例:

SELECT id, name, quantity
  FROM products
 WHERE quantity > 100
   AND id = IF('$var'=0,'%','$var');

'%'は、2番目の式を事実上無視して、何にでも一致するワイルドカードです。

于 2012-04-10T14:30:05.297 に答える
1

したがって、使用している場合

IfまたはCASE

SQLクエリでそれらを使用してみませんか。それは次のようなものになります

if ( $var == 0 ) {
$query_without_second_expression
}
else 
{
 $query_with_second_expression
}

しかし、あなたのSQLクエリでは。

DECLARE @var int
if(@var=1)
BEGIN
    query 1
END

else 
BEGIN
     query 2
end

これで問題は解決すると思います。しかし、個人的なアドバイスとして、1つのクエリを作成してみてください。変数があっても。条件に応じて標準クエリを変更することは考えていません。

それでもあなたの願いとあなたの欲望

乾杯!!

于 2012-04-10T14:31:41.900 に答える
1

この特定の問題については、Paper-batの単純な条件追加スニペットを使用してください。

ただし、whereステートメントがまったく異なる場合は、必要なものがわかったら、適切なwhereステートメントをクエリに追加することを検討してください。例えば、

$query = "SELECT id, name, quantity FROM products ";
if ( $var == 0 ) {
  $query .= "quantity > 100";
} elseif {
  $query .= "quantity > 120 AND id = '$var'";
} elseif {
...
}
...

それはすべてあなたのニーズに依存しますが、これもPaper-batのソリューションもクエリコードを複製しません。

于 2012-04-10T14:33:12.303 に答える