Wie man zwei Unterabfragen in SQLAlchemy und postgresql vereinigt

Raw SQL gewünscht:

SELECT id FROM (SELECT some_table.id FROM some_table WHERE some_table.some_field IS NULL) AS subq1 UNION (SELECT some_table.id WHERE some_table.some_field IS NOT NULL) LIMIT 10; 

Hier ist der Python-Code:

 import sqlalchemy SOME_TABLE = sqlalchemy.Table( 'some_table', sqlalchemy.MetaData(), sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True), sqlalchemy.Column('some_field', sqlalchemy.Text)) stmt_1 = sqlalchemy.sql.select(SOME_TABLE.columns).where(SOME_TABLE.columns.some_field != None) stmt_2 = sqlalchemy.sql.select(SOME_TABLE.columns).where(SOME_TABLE.columns.some_field == None) # This gets a programming error. stmt_1.union(stmt_2).limit(10); 

Hier ist die ausgegebene SQL (mit Parametern ausgetauscht), die diesen Fehler bekommt: FEHLER: Syntaxfehler bei oder nahe "UNION":

 SELECT some_table.id, some_table.some_field FROM some_table WHERE some_table.some_field IS NOT NULL LIMIT 10 UNION SELECT some_table.id, some_table.some_field FROM some_table WHERE some_table.some_field IS NULL LIMIT 10 LIMIT 10 

Wie kann ich die Unterabfragen ausrichten?

  • Sortieren nach einer Spalte in einer Gewerkschaftsabfrage in SqlAlchemy SQLite
  • Jaccard Distanz - Vereinigung und Kreuzung von Listen
  • Wie vereinigt man über mehrere Tabellen in SQLAlchemy?
  • One Solution collect form web for “Wie man zwei Unterabfragen in SQLAlchemy und postgresql vereinigt”

    Ich habe ein bisschen anders angefahren:

     # the first subquery, select all ids from SOME_TABLE where some_field is not NULL s1 = select([SOME_TABLE.c.id]).where(SOME_TABLE.c.some_field != None) # the second subquery, select all ids from SOME_TABLE where some_field is NULL s2 = select([SOME_TABLE.c.id]).where(SOME_TABLE.c.some_field != None) # union s1 and s2 subqueries together and alias the result as "alias_name" q = s1.union(s2).alias('alias_name') # run the query and limit the aliased result to 10 session.query(q).limit(10) 

    Hier ist die produzierte sql:

     SELECT alias_name.id AS alias_name_id FROM (SELECT some_table.id AS id FROM some_table WHERE some_table.some_field IS NOT NULL UNION SELECT some_table.id AS id FROM some_table WHERE some_table.some_field IS NULL) AS alias_name LIMIT 10 

    Ich denke, das ist das Ergebnis, das du wolltest.

    Python ist die beste Programmiersprache der Welt.