@petermの回答とこの回答は、結果セットで最大1行を返すSQLロジックに対応するように設計されています。
彼の答えは、単一の列を持つ単一の行を返すように設計されています。
私の答えは、1つ以上の列を持つ単一の行を返すように設計されています。
基本的に、最初のSELECTと同じ列数を持つUNION
2番目の句でハードコードされた値を使用できます。SELECT
OPの場合:
(
SELECT `file`
FROM `show`,
`schedule`
WHERE `channel` = 1
AND `start_time` BETWEEN UNIX_TIMESTAMP()-1799 AND UNIX_TIMESTAMP()
AND `show`.`id` = `schedule`.`file`
ORDER BY `start_time` DESC
LIMIT 1
) UNION (
SELECT 'default.webm'
)
ORDER BY file = 'default.webm'
LIMIT 1;
構文エラーがなければ、結果セットは、1つの列が。としてキー設定された1つの行を提供しますfile
。
より一般的な例として:(DB-Fiddle Demo)
(
SELECT Col1,Col2,Col3
FROM ExampleTable
WHERE ID='1234'
) UNION (
SELECT 'Def Val','none',''
)
ORDER BY Col1 = 'Def Val'
LIMIT 1;
結果:
最初のSELECTに行が見つからない場合、結果セットには2番目のSELECTの値が入力されます。配列としての結果セットは次のようになります。
[['Col1' => 'Def Val', 'Col2' => 'none', 'Col3' => '']]
最初のSELECTで1つの行が見つかった場合、最初のSELECT値が結果セットに提供され、2番目のSELECT値は省略されます。結果セットは次のようになります:(私のデモリンクを参照)
[['Col1' => 'A', 'Col2' => 'B', 'Col3' => 'C']]
*結果セットの連想キーは、最初のSELECTクエリの列名/エイリアスによって決定されます。
*後続のSELECTクエリでは、列エイリアスを指定する必要はありません。
* UNIONでは、2つの統合クエリの列名が同一である必要はありません。実際、後続のSELECTクエリの列名またはデータソースは何でもかまいません(異なる列、関数呼び出しなど)。
(
SELECT Col1,Col2,Col3
FROM ExampleTable
WHERE ID='1234'
) UNION (
SELECT 'Def Val' AS `Fallback1`,
'none' AS `Fallback2`,
'' AS `Fallback3`
)
ORDER BY Col1 = 'Def Val'
LIMIT 1;
私の意見では、これは非常に読みやすく、負担のかかる質問のようには思えません。
UNIONによって生成された行の順序に関する潜在的なバグを見つけてくれた@LudovicKutyに感謝します。https://dev.mysql.com/doc/refman/8.0/en/union.html#union-order-by-limit見つかった行の前にデフォルトの行が順序付けられる可能性を排除するには、次のようにORDERBY句を記述します。デフォルトの行が常に結果セットの後半で順序付けられるようにするための十分なロジック。デフォルトの行を識別するために使用できるさまざまなsql-dialect固有の構文があります。いくつかORDER BY columnName = 'default value'
は十分であり、他はorまたはorなどを要求するかもしれませんIF
。IIF
デフォルトCASE
が真の結果を返すようにロジックを構築する限り、trueはとして扱われ1
、falseはとして扱われます0
-そしてもちろん1
後になります0
昇順で並べ替える場合。