質問

ほとんどのデータベースには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>

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top