# Elasticsearch SQLの判定がおかしい

**URL:** <https://discuss.elastic.co/t/elasticsearch-sql/211049>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [December 9, 2019, 5:06am UTC](https://discuss.elastic.co/t/elasticsearch-sql/211049 "2019-12-09T05:06:27Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![sshota](https://avatars.discourse-cdn.com/v4/letter/s/f9ae1b/32.png) [@sshota](https://discuss.elastic.co/u/sshota)\
**Post date:** [December 9, 2019, 5:06am UTC](https://discuss.elastic.co/t/elasticsearch-sql/211049/1 "2019-12-09T05:06:27Z")

</div>

お世話になります。

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

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

```

結果：`test=0`

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

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

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

```

結果：`test=1` ← 想定どおり

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

---

<div class="post-metadata">

**Author:** ![sshota](https://avatars.discourse-cdn.com/v4/letter/s/f9ae1b/32.png) [@sshota](https://discuss.elastic.co/u/sshota)\
**Post date:** [December 9, 2019, 5:12am UTC](https://discuss.elastic.co/t/elasticsearch-sql/211049/2 "2019-12-09T05:12:39Z")

</div>

## 追記

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

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

```

`test=1`

## 補足（動作環境）

- Elasticsearch 7.3.0
- Kibana 7.3.0

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [December 9, 2019, 6:09am UTC](https://discuss.elastic.co/t/elasticsearch-sql/211049/3 "2019-12-09T06:09:36Z")

</div>

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

```auto
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
  """
}

```

返された結果

```auto
{
  "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にしてみました。

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

```

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

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

```

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

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

---

<div class="post-metadata">

**Author:** ![sshota](https://avatars.discourse-cdn.com/v4/letter/s/f9ae1b/32.png) [@sshota](https://discuss.elastic.co/u/sshota)\
**Post date:** [December 9, 2019, 7:01am UTC](https://discuss.elastic.co/t/elasticsearch-sql/211049/4 "2019-12-09T07:01:19Z")

</div>

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

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

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

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [January 6, 2020, 7:01am UTC](https://discuss.elastic.co/t/elasticsearch-sql/211049/5 "2020-01-06T07:01:25Z")

</div>

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