質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

BigQuery: 完全一致で抽出したいデータが部分一致で抽出される

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 149

Tiroze

score 18

■問題とやりたいこと
以下形式のSQL(BigQuery)を実行した所、抽出対象データは0件の想定ですが、
3件とも抽出されてしまいます。想定通りの結果としたい場合の対処方法、または、考えられる原因がありましたら教えて頂けますでしょうか?

■状況
・comp_aテーブル単体での抽出の場合は抽出対象データは0件となりますが、comp_bテーブルを
結合すると条件に一致していないデータ3件が抽出されます。
・本来のSQLを公開できないため、以下はデータ構成、条件を再現したサンプルSQLとなります。
・とあるPCでは発生し、別のPCで発生しません。
・ブラウザのキャッシュは削除し、BigQueryのキャッシュ利用はOFFにしています。
・末尾3桁を除き、IN句の条件は一致しているため、前方一致のような条件になってしまったのではと思います。

■コード

WITH a AS(
    SELECT
        001 AS id_a,
        112345678901234567 AS x
    UNION ALL
    SELECT
        002,
        112345678901233567
    UNION ALL
    SELECT
        003,
        112345678901232568
),
comp_a AS(
    SELECT
        *
    FROM
        a
    WHERE
        x IN(112345678901234000, 112345678901233000, 112345678901232000)
),
comp_b AS(
    SELECT
        004 AS id_b
    UNION ALL
    SELECT
        005
)
SELECT
    id_a,
    id_b
FROM
    comp_a
    LEFT OUTER JOIN
        comp_b
    ON  (
            comp_a.id_a = comp_b.id_b
        )
WHERE
    comp_b.id_b IS NULL
;
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

末尾3桁を除き、IN句の条件は一致しているため、前方一致のような条件になってしまったのではと思います。

末尾3桁を除くのにINは使用できません。文字ならLikeですし、数値なら割り算などが必要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/28 09:18 編集

    > 112345678901234000のデータは抽出されるが112345678901234999は抽出されないのが正しい
    aに112345678901234000のデータがunionで追加されているのが正しい姿ですか?

    キャンセル

  • 2019/06/28 09:59

    > 末尾3桁を除き、IN句の条件は一致しているため、前方一致のような条件になってしまったのでは
    DBMSの動作がおかしいのではと疑われているという事なんですよね?

    キャンセル

  • 2019/07/10 01:24

    回答ありがとうございます。
    SQLの問題ではなく、データ確認時にExcelに貼り付けたところ数値部分が丸められていたことが原因でした。正しく抽出できていたのですが、SQL上の抽出条件とExcel上の丸められた数値では差異が出てしまったために正しく抽出されていないと勘違いしておりました。
    お手数お掛けして申し訳ありませんでした。

    キャンセル

0

>・comp_aテーブル単体での抽出の場合は抽出対象データは0件となりますが、`SQL ... WITH a AS(     SELECT         112345678901234567 AS x ...         112345678901233567 ...         112345678901232568 なのに ...         x IN(112345678901234000, 112345678901233000, 112345678901232000) ...
と存在しないデータをwhere条件としているからです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/28 02:50

    わかりづらい記載で申し訳ありません。
    想定する結果:抽出データ0件
    今発生している結果:抽出データ3件

    となります。存在しないデータをwhere条件にしていると、抽出件数は0となるかと考えておりますが違うのでしょうか?

    キャンセル

  • 2019/06/28 03:07

    現象を再現できるシンプルなコードに修正されては?
    正規サポートに問い合わせる方法もあります。
    https://cloud.google.com/bigquery/support?hl=ja

    キャンセル

  • 2019/07/10 01:24

    回答ありがとうございます。
    SQLの問題ではなく、データ確認時にExcelに貼り付けたところ数値部分が丸められていたことが原因でした。正しく抽出できていたのですが、SQL上の抽出条件とExcel上の丸められた数値では差異が出てしまったために正しく抽出されていないと勘違いしておりました。
    お手数お掛けして申し訳ありませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る