Sybase ASEでGreatest()をシミュレートする方法は?
-
27-10-2019 - |
質問
ほとんどのデータベースにはaのようなものがあります GREATEST
機能。これは時々役立ちます。少なくともこれらのデータベースにはそのような機能がありません。
- ダービー
- SQLサーバー
- sybase ase
- Sybase SQLはどこでも
SQL ServerとSybase SQLの場合、サブQueriesを使用して機能をシミュレートできます。 UNION ALL
, 、見ることができるように この質問はここにあります. 。例:
-- SELECT GREATEST(field1, field2, field3) FROM my_table
SELECT (SELECT MAX(c) FROM
(SELECT my_table.field1 AS c UNION ALL
SELECT my_table.field2 UNION ALL
SELECT my_table.field3) T) AS greatest
FROM my_table
しかし、これはSybase ASEでは機能しません。どうやら、サブ征服は外側のクエリにアクセスできません my_table
参照。私が得るエラーはです
列のプレフィックス「my_table」は、クエリで使用されるテーブル名またはエイリアス名と一致しません。テーブルはFrom句で指定されていないか、代わりに使用する必要がある相関名があります
この問題は、Sybase SQLにはどこにも表示されないことに注意してください。ここで何が問題なのか、どのようにしてクエリを書き直すことができますか?
避けたいです
- 私はそれらを作成するために必要な助成金を持っていないかもしれないので、保存された関数
- 長い
CASE
式、ネストされたすべての比較の結合順列の式の式の長さとしてCASE
表現は少なくともですO(n^2)
いつn
のパラメーターの数ですGREATEST
解決
私が理解しているように、論理(ヌルを無視する)は
SELECT CASE
WHEN field1 >= field2
AND field1 >= field3
THEN field1
WHEN field2 >= field3
THEN field2
ELSE field3
END AS greatest
FROM my_table;
...ただし、すべての値がnullの場合にのみnullを返す必要があります。
これは私が物事をやりたいと思っている方法だと思います(ただし、Sybase ASEは一般的なテーブル式をサポートしていません):
WITH my_table
AS
(
SELECT *
FROM (
VALUES ('A', 1, 2, 3),
('B', 2, 3, 1),
('C', 3, 1, 2),
('D', NULL, 2, 3),
('E', NULL, NULL, 3),
('F', NULL, 3, NULL),
('G', 1, NULL, 3),
('H', 1, 3, NULL),
('X', NULL, NULL, NULL)
) AS T (ID, field1, field2, field3)
),
T1
AS
(
SELECT ID, field1 AS field_n
FROM my_table
UNION
SELECT ID, field2 AS field_n
FROM my_table
UNION
SELECT ID, field3 AS field_n
FROM my_table
)
SELECT ID, MAX(field_n) AS greatest
FROM T1
GROUP
BY ID;
他のヒント
その場合、1つ追加します CASE
.
SELECT
CASE WHEN field1 IS NOT NULL
AND field2 IS NOT NULL
AND field3 IS NOT NULL THEN
CASE WHEN field1 >= field2
AND field1 >= field3
THEN field1
WHEN field2 >= field3
THEN field2
ELSE field3
END
ELSE
NULL
END AS greatest
FROM my_table
次のSQL句はさらに簡潔です onedayの答え, 、それらは意味的に同等ですが:
SELECT CASE WHEN field1 >= ALL(field2, field3, field4) THEN field1
WHEN field2 >= ALL( field3, field4) THEN field2
WHEN field3 >= ALL( field4) THEN field3
ELSE field4
END AS greatest
FROM my_table;
これは最終的に、SQLで誰もほとんど使用していない数量ファイヤーにとってはまれでありながら素晴らしいユースケースです。この質問も参照してください:
すべてのSQL方言のSQLおよびいくつかのキーワードの同義語はありますか?
残念ながら、この構文はすべてのSQL方言でサポートされていません。 ALL
数量装置は、aを期待しています <table subquery>