How to declare a variable in a PostgreSQL query

后端 未结 12 1290
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-22 09:34

How do I declare a variable for use in a PostgreSQL 8.3 query?

In MS SQL Server I can do this:

DECLARE @myvar INT
SET @myvar = 5

SELECT *
FROM somew         


        
相关标签:
12条回答
  • 2020-11-22 09:49

    In DBeaver you can use parameters in queries just like you can from code, so this will work:

    SELECT *
    FROM somewhere
    WHERE something = :myvar
    

    When you run the query DBeaver will ask you for the value for :myvar and run the query.

    0 讨论(0)
  • 2020-11-22 09:50

    You could also try this in PLPGSQL:

    DO $$
    DECLARE myvar integer;
    BEGIN
        SELECT 5 INTO myvar;
    
        DROP TABLE IF EXISTS tmp_table;
        CREATE TABLE tmp_table AS
        SELECT * FROM yourtable WHERE   id = myvar;
    END $$;
    
    SELECT * FROM tmp_table;
    

    The above requires Postgres 9.0 or later.

    0 讨论(0)
  • 2020-11-22 09:51

    This solution is based on the one proposed by fei0x but it has the advantages that there is no need to join the value list of constants in the query and constants can be easily listed at the start of the query. It also works in recursive queries.

    Basically, every constant is a single-value table declared in a WITH clause which can then be called anywhere in the remaining part of the query.

    • Basic example with two constants:
    WITH
        constant_1_str AS (VALUES ('Hello World')),
        constant_2_int AS (VALUES (100))
    SELECT *
    FROM some_table
    WHERE table_column = (table constant_1_str)
    LIMIT (table constant_2_int)
    

    Alternatively you can use SELECT * FROM constant_name instead of TABLE constant_name which might not be valid for other query languages different to postgresql.

    0 讨论(0)
  • 2020-11-22 09:52

    I accomplished the same goal by using a WITH clause, it's nowhere near as elegant but can do the same thing. Though for this example it's really overkill. I also don't particularly recommend this.

    WITH myconstants (var1, var2) as (
       values (5, 'foo')
    )
    SELECT *
    FROM somewhere, myconstants
    WHERE something = var1
       OR something_else = var2;
    
    0 讨论(0)
  • 2020-11-22 09:55

    I want to propose an improvement to @DarioBarrionuevo's answer, to make it simpler leveraging temporary tables.

    DO $$
        DECLARE myvar integer = 5;
    BEGIN
        CREATE TEMP TABLE tmp_table ON COMMIT DROP AS
            -- put here your query with variables:
            SELECT * 
            FROM yourtable
            WHERE id = myvar;
    END $$;
    
    SELECT * FROM tmp_table;
    
    0 讨论(0)
  • 2020-11-22 10:01

    You may resort to tool special features. Like for DBeaver own proprietary syntax:

    @set name = 'me'
    SELECT :name;
    SELECT ${name};
    
    DELETE FROM book b
    WHERE b.author_id IN (SELECT a.id FROM author AS a WHERE a.name = :name);
    
    0 讨论(0)
提交回复
热议问题