【QUERY関数】WHERE句で指定した条件にマッチするデータを抽出する方法まとめ

QUERY関数のWHERE句を使用すると、自分で指定した条件にマッチするデータを絞り込んで抽出することができます。

例えば、このデータから給料が800以上である人だけを絞り込みたい場合は、以下のクエリ文を記述します。

=QUERY(B2:I8, "WHERE E >= 800")

これで、給料を800以上もらっている人は、JohnMikeであることが分かりました。

QUERY関数は、第1引数に『データ』、第2引数に『目的に沿ったSQL風なクエリ文』を書くという流れになるので、この第2引数クエリを思い通りに操れるかどうか、が目的のデータを正しく抜き出すための必要条件になります。

2020年12月現在、11種類ものクエリ句が存在し、

クエリ句役割重要度(5段階)
SELECTデータから列を抽出する★★★★★
WHEREWHERE句で条件に一致する行を抽出する★★★★★
GROUP BY列のデータを行方向に集約(グルーピング)する★★★★★
PIVOT列のデータを列方向に集約(グルーピング)する★★★★☆
ORDER BY出力されるデータを並び替える★★★★☆
SKIPPING出力されるデータの先頭行から任意の行数ずつスキップする★☆☆☆☆
LIMIT出力されるデータの行数を制限する★★★☆☆
OFFSET出力されるデータの先頭行から任意の行数スキップする★★☆☆☆
LABEL出力される列名を変更する★★★★☆
FORMAT出力される列のデータの書式を変更する★★★☆☆
OPTIONS追加オプションを設定する★☆☆☆☆

この記事では、条件に一致する行を抽出するWHERE句について、じっくり解説していきます。

WHERE句の基本

WHERE句は、WHERE比較演算子の間に半角スペースを入力して、"WHERE 列 比較演算子 値"とクエリ文を書くと、任意の条件に絞り込んだデータだけを抽出することができます。

WHERE句の基本構文
=QUERY(データ, "WHERE 列 比較演算子 値")
=QUERY(B2:I8, "WHERE E >= 800")

比較演算子は、以下の表にまとめています。

比較演算子意味データ型
=一致すべて
<>以外すべて
<=以下numberdatetimeofdaydatetime
<未満numberdatetimeofdaydatetime
>=以上numberdatetimeofdaydatetime
>超過numberdatetimeofdaydatetime

プログラマの方は、『一致』の === 、『以外』の <>!= を間違えないように注意してくださいね。

数値データ(number)

数値データは、クエリ文字列の中では10進法で指定します。万が一、データが2進法や16進法で格納されている場合は10進法に戻しましょう。例:8000.3

年齢(age)が30歳以下の人を抽出
=QUERY(B2:I8, "WHERE G <= 30")
年齢(age)が30歳以下の人を抽出

文字列データ(string)

文字列データは、クエリ文字列の中でシングルクォーテーションで囲む必要があります。例:'Eng''Dave'

所属(dept)がエンジニア以外の人を抽出
=QUERY(B2:I8, "WHERE C <> 'Eng'")
所属(dept)がエンジニア以外の人を抽出

日付データ(date)

日付データは、クエリ文字列の中でキーワード DATE の後に、yyyy-MM-dd 形式の文字列を続けて記述します。例: DATE '2008-03-18'

注意点はDATE '2008/03/18'DATE '2008-3-18'とするのではなく、DATE '2008-03-18'と正確に記述しなければいけない点です。

雇われた日(hireDate)が2005年1月1日以降の人を抽出
=QUERY(B2:I8, "WHERE F >= DATE '2005-01-01'")
雇われた日(hireDate)が2005年1月1日以降の人を抽出

時刻データ(timeofday)

時刻データは、クエリ文字列の中でキーワード TIMEOFDAY の後に、HH:mm:ss[.SSS] 形式の文字列を続けて記述します。例: TIMEOFDAY '13:00:00'

ミリ秒部分はオプションなので、省略可能です。

お昼休憩時間(lunchTime)が13:00:00である人を抽出
=QUERY(B2:I8, "WHERE D = TIMEOFDAY '13:00:00'")
お昼休憩時間(lunchTime)が13:00:00である人を抽出

日時データ(datetime)

日時データは、クエリ文字列の中でキーワード DATETIME の後に、yyyy-MM-dd HH:mm:ss[.SSS] 形式の文字列を続けて記述します。例: DATETIME '2007-12-02 13:00:00'

ミリ秒部分はオプションなので、省略可能です。

上長になった日時(seniorityStartTime)が2007年1月1日 0時0分0秒以降である人を抽出
=QUERY(B2:I8, "WHERE I >= DATETIME '2007-01-01 00:00:00'")
上長になった日時(seniorityStartTime)が2007年1月1日 0時0分0秒以降である人を抽出

真偽値データ(boolean)

真偽値データは、クエリ文字列の中で数値データと同じようにシングルクォーテーションで囲まず、そのままTRUEまたはFALSEと記述します。

上長である人(isSenior = TRUE)を抽出
=QUERY(B2:I8, "WHERE H = TRUE")
上長である人(isSenior= TRUE)を抽出

高度な条件抽出(文字列比較演算子)

WHERE句には6つの比較演算子の他にも、もっと柔軟にデータを抽出することができる、5つの文字列比較演算子が存在します。

クエリ文も大きくは変わらず、"WHERE 列 文字列比較演算子 値"と記述します。

文字列比較演算子意味
IS NULL欠損値抽出
IS NOT NULL有効データ抽出
CONTAINS部分一致抽出
LIKEワイルドカード抽出
MATCHES正規表現一致抽出

それぞれ見てみましょう。

IS NULL(欠損値抽出)

欠損値とはデータの欠損、つまり空白(nullNaN)のことを指しています。

文字列比較演算子の IS NULL を使うと、空白である人を抽出することができます。

このデータで説明すると、I列の上長になった日(seniorityStartTime)にデータの欠損が見受けられます。

上長になった日時(seniorityStartTime)が入力されていない人を抽出
=QUERY(B2:I8, "WHERE I IS NULL")
上長になった日時(seniorityStartTime)が入力されていない人を抽出

IS NOT NULL(有効データ抽出)

有効データとは欠損値ではないデータ、つまり空白(nullNaN)ではないことを指しています。

文字列比較演算子の IS NOT NULL を使うと、有効データのみを抽出することができます。

上長になった日時(seniorityStartTime)から有効データのみ抽出
=QUERY(B2:I8, "WHERE I IS NOT NULL")
上長になった日時(seniorityStartTime)から有効データのみ抽出

CONTAINS(部分一致抽出)

部分一致とは、指定した値の前後に他の値が含まれていても一致することを指しています。

文字列比較演算子の CONTAINS を使うと、部分一致抽出することができます。

名前(name)にDaを含む人のみ抽出
=QUERY(B2:I8, "WHERE B CONTAINS 'Da'")
名前(name)にDaを含む人のみ抽出

LIKE(ワイルドカード抽出)

文字列比較演算子の LIKE を使うと、2種類のワイルドカードを使って抽出できます。

ワイルドカード意味
_任意の1文字
%0文字または任意の1文字以上
ワイルドカードの例
  • '____' : 任意の4文字
  • 's___' : sで始まる4文字
  • 'a%' : aで始まる文字(前方一致)
  • '%n' : nで終わる文字(後方一致)
  • 'a%e' : aで始まり、eで終わる文字

名前(name)がDで始まって4文字である人を抽出
=QUERY(B2:I8, "WHERE B LIKE 'D___'")
名前(name)がDで始まって4文字である人を抽出

MATCHES(正規表現一致抽出)

文字列比較演算子の MATCHES を使うと、正規表現を使ってデータを抽出することができます。

正規表現については、この記事の範疇を超えているので、以前書いた記事を参考にしてください。

知らないと損!正規表現を使ってスプレッドシートの文字列を便利に抽出する方法
名前(name)がeで終わって4文字である人を抽出
=QUERY(B2:I8, "WHERE B MATCHES '.{3}e'")
名前(name)がeで終わって4文字である人を抽出

複数条件と否定(論理演算子)

WHERE句では論理演算子を用いて、複数の条件を指定したり、否定したりすることができます。

論理演算子意味
AND論理積
OR論理和
NOT否定

AND(論理積抽出)

論理演算子ANDは、クエリ文の中で"WHERE 条件式A AND 条件式B"と記述すると、AかつB、つまり条件式AとBを同時にみたすデータを抽出することができます。

所属(dept)がエンジニア かつ 年齢(age)が30歳以上である人を抽出
=QUERY(B2:I8, "WHERE C = 'Eng' AND G >= 30")
所属(dept)がエンジニア かつ 年齢(age)が30歳以上である人を抽出

OR(論理和抽出)

論理演算子ORは、クエリ文の中で"WHERE 条件式A OR 条件式B"と記述すると、AまたはB、つまり条件式AまたはBのいずれかをみたすデータを抽出することができます。

雇われた日(hireDate)が2005年1月1日より前 または 上長(isSenior=TRUE)である人を抽出
=QUERY(B2:I8, "WHERE NOT(C = 'Eng' AND G >= 30)")
雇われた日(hireDate)が2005年1月1日より前 または 上長(isSenior=TRUE)である人を抽出

NOT(否定抽出)

論理演算子NOTは、クエリ文の中で"WHERE NOT 条件式"と記述すると、条件式の否定、つまり条件をみたさないデータを抽出することができます。

NOTを使うと、ANDのときに例で紹介した『所属(dept)がエンジニア かつ 年齢(age)が30歳以降である』という条件は、『所属(dept)がエンジニア かつ 年齢(age)が30歳以降ではない』、つまり、『所属(dept)がエンジニアではない または 年齢(age)が30歳未満である』と変換されます。(=ド・モルガンの法則)

所属(dept)がエンジニアではない または 年齢(age)が30歳未満である 人を抽出
=QUERY(B2:I8, "WHERE C = 'Eng' AND G >= 30")
所属(dept)がエンジニアではない または 年齢(age)が30歳未満である 人を抽出

WHERE句×スカラー関数

WHERE句とスカラー関数を組み合わせると、スカラー関数に適用させた値で絞り込みすることができます。

スカラー関数説明使用できる列のデータ型戻り値のデータ型
YEAR年の値を返すdatedatetimenumber
MONTHゼロベースの月の値を返す(0〜11)datedatetimenumber
DAY日の値を返すdatedatetimenumber
HOUR時間の値を返すdatetimetimeofdaynumber
MINUTE分の値を返すdatetimetimeofdaynumber
SECOND秒の値を返すdatetimetimeofdaynumber
MILLISECONDミリ秒の値を返すdatetimetimeofdaynumber
QUARTER四半期の値を返す(1〜4)datedatetimenumber
DAYOFWEEK曜日の値を返す、{1:日, … , 7:土}datedatetimenumber
NOW現在の日時を返すNoneNone
DATEDIFF2つの日付の日数差を返す(時間は切り捨て)datedatetimenumber
UPPER大文字を返すstringstring
LOWER小文字を返すstringstring

スカラー関数はこれだけありますが、WHERE句で使うのは日付や時刻を抜き出すYEARMONTHDAYHOURDAYOFWEEKくらいですね。

雇われた日(hireDate)が2005年である人を抽出
=QUERY(B2:I8, "WHERE YEAR(F) = 2005")
雇われた日(hireDate)が2005年である人を抽出

連載:QUERY関数完全攻略

英語で書かれた公式ドキュメントをベースに、マーケッターの誰もがQUERY関数を完全に使いこなすための連載記事を作成しました。分析するときの辞書代わりとして利用してください。

  • データ分析関数『QUERY関数』の使い方をひと通り
  • SELECT句でデータから列を抽出する
  • WHERE句で条件に一致する行を抽出する
  • GROUP BY句で行方向にグループ集計する
  • PIVOT句で列方向にグループ集計、クロス集計する
  • ORDER BY句で出力されるデータを並び替える
  • SKIPPING句で出力されるデータの先頭行から任意の行数ずつスキップする
  • LIMIT句で出力されるデータの行数を制限する
  • OFFSET句で出力されるデータの先頭行から任意の行数スキップする
  • LABEL句で出力される列名を変更する
  • FORMAT句で出力される列のデータの書式を変更する
  • ARRAYFORMULA関数とVLOOKUP関数で『OUTER JOIN』を実現する
  • QUERY関数100本ノック

それと、筆者がQUERY関数についてまとめたスプレッドシートをこちらで公開しています。QUERY関数の理解がより深まること間違いなしです!