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

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

新規登録して質問してみよう
ただいま回答率
85.50%
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1098閲覧

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

Tiroze

総合スコア35

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/06/27 17:28

編集2019/06/27 17:32

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

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

■コード

SQL

1WITH a AS( 2 SELECT 3 001 AS id_a, 4 112345678901234567 AS x 5 UNION ALL 6 SELECT 7 002, 8 112345678901233567 9 UNION ALL 10 SELECT 11 003, 12 112345678901232568 13), 14comp_a AS( 15 SELECT 16 * 17 FROM 18 a 19 WHERE 20 x IN(112345678901234000, 112345678901233000, 112345678901232000) 21), 22comp_b AS( 23 SELECT 24 004 AS id_b 25 UNION ALL 26 SELECT 27 005 28) 29SELECT 30 id_a, 31 id_b 32FROM 33 comp_a 34 LEFT OUTER JOIN 35 comp_b 36 ON ( 37 comp_a.id_a = comp_b.id_b 38 ) 39WHERE 40 comp_b.id_b IS NULL 41;

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

投稿2019/06/27 20:08

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tiroze

2019/06/27 21:21

紛らわしい表現で申し訳ありません。 >末尾3桁を除くのにINは使用できません。 末尾3桁を除くのは目的(やりたいこと)ではありません。 完全一致(項目xのin句抽出条件の値として112345678901234000がIN句に指定されているとき112345678901234000 のデータは抽出されるが112345678901234999は抽出されないのが正しい。)のデータを抽出したいのですが、それができません。対象データのxの値を見たところlike句等で前方一致したら抽出されるようなデータが抽出されておりましたので、状況のヒントになるかと思い記載させて頂きました。 また、違う人のBigQueryの環境では再現できませんので、もしかしたら、SQL codeの問題ではなく、BigQueryの環境設定の問題かもしれません。
sazi

2019/06/28 00:12 編集

>本来のSQLを公開できないため、以下はデータ構成、条件を再現したサンプルSQL 質問のSQLは0件になりますので、そもそもサンプルでは再現できていない可能性はあります。 意図した環境で提示されているSQLで同様に再現できていますか? 再現できている(無いでしょうけど)なら、言われているようにSQL文以外が要因なのでしょう。
sazi

2019/06/28 00:57 編集

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

2019/06/28 00:59

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

2019/07/09 16:24

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

0

・comp_aテーブル単体での抽出の場合は抽出対象データは0件となりますが、```SQL

...
WITH a AS(
SELECT
112345678901234567 AS x
...
112345678901233567
...
112345678901232568
なのに
...
x IN(112345678901234000, 112345678901233000, 112345678901232000)
...
``
と存在しないデータをwhere条件としているからです。

投稿2019/06/27 17:44

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tiroze

2019/06/27 17:50

わかりづらい記載で申し訳ありません。 想定する結果:抽出データ0件 今発生している結果:抽出データ3件 となります。存在しないデータをwhere条件にしていると、抽出件数は0となるかと考えておりますが違うのでしょうか?
Tiroze

2019/07/09 16:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問