Existe-t-il un moyen simple d'adapter ces types de requêtes MySQL à PostgreSQL:
définir des variables dans MySQL comme
set @aintconst = -333 set @arealconst = -9.999
Assigner des variables à partir de requêtes SELECT et utiliser ces variables par la suite dans mon SQL comme:
select @pfID := id from platform where bios like '%INTEL%' select @clientID := id from client where platformID = @pfID
Je serais très reconnaissant aux pointeurs, en particulier sur (2).
mysql
postgresql
Daniel
la source
la source
Réponses:
C'est facile à faire dans une fonction PL / pgSQL (ou un bloc DO ):
Vous pouvez également utiliser des variables GUC :
Ou vous pouvez utiliser un CTE avec une jointure:
la source
J'utilise des instructions WITH:
et:
la source
Vous avez déjà répondu vous-même à cette question: non, il n'y en a pas en SQL simple. Vous pouvez utiliser PL / PgSQL si vous voulez des variables, dans une fonction ou un
DO
bloc.La plupart des utilisations des variables de requête dans MySQL sont satisfaites par les CTE (
WITH
requêtes), les fonctions de fenêtre, etc. dans PostgreSQL.Eh bien, en fait, il existe, mais ils ne conviennent pas à une utilisation générale dans les requêtes. Vous accédez généralement aux GUC personnalisés avec
SET
etSHOW
, mais vous pouvez utiliser à la place:Les GUC sont chers et c'est une mauvaise idée de l'utiliser pour des requêtes à usage général, mais il y a très occasionnellement une utilisation valide. Vous pouvez uniquement utiliser des paramètres tels que
myapp.variable
.la source
Variables PSQL
Depuis au moins la version 7.1, le client PostgreSQL a fourni cette fonctionnalité avec des
psql
variablesEssentiellement, ce que vous voulez, c'est la possibilité de script SQL. PSQL a des conditions et des variables, et la possibilité de réinjecter du SQL généré dynamiquement, ce qui facilite ce travail. Ce n'est pas une fonctionnalité côté serveur dans le monde PostgreSQL, et généralement je le ferais dans un langage client (comme Node.js ou Perl plutôt qu'en
psql
).la source
SET LOCAL variable value
Pour le deuxième exemple, vous n'avez pas besoin d'une variable (ni dans MySQL ni dans Postgres):
N'ayez pas peur des sous-requêtes, l'optimiseur de requêtes de Postgres est beaucoup plus intelligent que MySQL.
Si ce qui précède est trop lent, sa réécriture dans une
exists
requête est parfois plus rapide:la source