Elasticsearch SQLの判定がおかしい

お世話になります。

CanvasのImage revealエレメントで、data source に Elaticsearch SQLを指定しています。
SQLの中で、値がXX以上なら~のような構文を書いているのですが、想定どおり動作しない箇所があります。

SELECT CASE WHEN round(0,3) < 0  THEN 0 ELSE 1 END AS "test"

結果:test=0

この場合、想定する動きとして round(0,3) < 0 は偽であるため、 test=1 となるはずです。
このような値をとる理由がわかりません。

また、下記のようにround関数をかまさない場合は、正常に動作します。

SELECT CASE WHEN 0 < 0  THEN 0 ELSE 1 END AS "test"

結果:test=1 ← 想定どおり

何か原因などわかりますでしょうか。
どうぞよろしくお願いいたします。

追記

以下のとおり、roundで演算する値と、右オペランドをそれぞれ 0→1 に変更した場合は、
正常に動作しました。

SELECT CASE WHEN round(1,3) < 1  THEN 0 ELSE 1 END AS "test1"

test=1

補足(動作環境)

  • Elasticsearch 7.3.0
  • Kibana 7.3.0

7.5でも round(0, 1) < 0 のような場合、おっしゃるような現象になりますね。

POST forum1209/_doc/1
{
  "value": 0
}

POST _sql
{
  "query": """
  SELECT CASE WHEN round(value, 1) < 0 THEN 'minus'
              WHEN round(value, 1) > 0 THEN 'plus'
         ELSE 'zero' 
         END as pattern1 ,
         CASE WHEN value < 0 THEN 'minus'
              WHEN value > 0 THEN 'plus'
         ELSE 'zero' 
         END as pattern2 ,
    round(value, 1) as pattern3
  from forum1209
  """
}

返された結果

{
  "columns" : [
    {
      "name" : "pattern1",
      "type" : "keyword"
    },
    {
      "name" : "pattern2",
      "type" : "keyword"
    },
    {
      "name" : "pattern3",
      "type" : "float"
    }
  ],
  "rows" : [
    [
      "minus",
      "zero",
      -0.0
    ]
  ]
}

で、ここまで書いて気づいたのですが、最後のround(0, 1)の結果がfloatで-0.0になっています。
なので、判定する値を0ではなく、-0.0にしてみました。

POST _sql
{
  "query": """
  SELECT 
    CASE WHEN round(0,1) < -0.0  THEN 0
    ELSE 1
    END AS "test"
  """
}

とすると、期待された結果が得られるようです。

POST _sql
{
  "query": """
  SELECT 
    CASE WHEN -0.0 < 0  THEN '-0.0は0よりすくない'
    ELSE 'そうでもない'
    END AS "test"
  """
}

こうしてみると、当初の現象通りの動きが確認できました。

なぜそうなるのか、根本原因はわかりませんがとりあえずの回避法になりましたら幸いです。

早速ご回答頂きまして、ありがとうございました。

そのような確認方法があったのですね。
私のほうでも実際のデータに対して、Dev Toolを使用して確認したところ、
確かに該当項目が-0.0となり、おっしゃるとおりの方法で回避できました。

とりあえず暫定的にこちらで対応したいと思います。
ありがとうございました。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.