プロバイダの地物フィールドについて

373 views
Skip to first unread message

フリード・ティンクス

unread,
Nov 22, 2019, 8:57:28 PM11/22/19
to QGIS初心者質問グループ
フリードです。
おはようございます。

プロバイダ地物フィルタでフィルタをかけております。

その時に
①shpファイルに対してフィルタをかけているのですが、たとえば 添付したファイルで
"新市名称"in(''NULL'')
とやったらNULLの部分だけが帰ってほしいのに、全部帰ってくる。NULLの部分だけを帰すことはできないでしょうか?

あと、抽出した時に、地物が全部消えてしまうこともあるのですが、なんででしょうか?

"新市名称" like '豊田市'
"新市名称" = '豊田市'
"新市名称" like '豊田市'
の場合、違いってあるのでしょうか?

新市名称に「豊」が入っている部分だけを抽出したい場合、部分一致検索ってできるのでしょうか?

フリード・ティンクス

unread,
Nov 22, 2019, 8:58:17 PM11/22/19
to QGIS初心者質問グループ
すみませんファイル添付忘れました。
mapaichi_shp_c309.zip

sakuya_izayoi

unread,
Nov 22, 2019, 9:50:58 PM11/22/19
to QGIS初心者質問グループ
こちらizayoiです。

分かる範囲で。
②に関してはおそらく全部一緒に意味に今回はなっていると思います。
むしろ一番最初と最後って何の違いがあるのだろうか?
似たようなって言っていることから推測するに
"新市名称" in ('豊田市')
のまちがいでしょうか?

③に関してですが、ここでlikeの意味が出てきます。
'%豊%'
とすることで部分一致となります。
"新市名称" like '%豊%'
で選べます。

①に関しては、Geopackageにすれば対応できましたけど、なんだかなぁという感じです。

yoh_chan

unread,
Nov 24, 2019, 12:49:09 AM11/24/19
to QGIS初心者質問グループ
こんにちは。

表現が正確ではないかもしれませんが、ベクタデータの形式によってデータプロバイダが違うので、プロバイダ地物フィルタはそのプロバイダに対応したフィルタ式しか正しく認識しないのだと思います。

shpの場合、属性データはdbf(dBASE)に格納されています。
LIKEを含む①~③に挙げていただいた式はSQLに準拠したものですが、dBASEではこれらを認識しません。
なので、添付していただいたサンプルデータをこちらの環境で確認しましたが、フィルタが効かなかったり、属性データはフィルタされているのに地物はフィルタされなかったり、いずれも正しいフィルタ結果は得られませんでした。

これに対して、GeopackageはSQLiteデータベースなので、LIKEを含むSQLが利用できます。
izayoiさんが①について言われた通り、NULLでもフィルタが機能します。

なお、NULLを抽出するために使用する比較演算子は、ISです。なので、①は
 "新市名称" IS NULL
となります。原文ではシングルクォーテーションを2つ使用して''NULL''とされていましたが、こうした表記は無効です。

②については、LIKEの方が曖昧な比較となります。
たとえば、
 'a' = 'A' または 'a' IS 'A'
はFALSEですが、
 'a' LIKE 'A'
はTRUEとなります。日本語を含むマルチバイト文字を比較する場合はあまり気にする必要はないかもしれません。

なお、LIKEとINは組み合わせられませんので、ANDやORを使って組み合わせることになります。

詳しくはSQLiteのリファレンスをご参照くださいませ。

フリード・ティンクス

unread,
Nov 24, 2019, 9:42:24 PM11/24/19
to QGIS初心者質問グループ
izayoi様、yoh_chan様
分かりやすい解説をありがとうございます。
NULL抽出の方法は間違って使っておりました。
これはSQLiteという構文なのですね。初めて知りました。
今までOpenOfficeのBaseというソフトを使って
select * from datatable
where "地物" Not like '豊橋'
など、データの絞り込みだけを行っていたのですけど、この構文ももしかしてSQLiteなのでしょうか?
(Baseというソフトはデータの閲覧用で使ってます。書き換えたりなどはやり方不明です。)

yoh_chan

unread,
Nov 25, 2019, 7:42:43 PM11/25/19
to QGIS初心者質問グループ
こんにちは。

SQLiteというのは、RDBMSと呼ばれるデータベース(およびその管理システム)の一つです。
他にも、PostgreSQLやMySQL、MicrosoftのAccessなど、いろいろなデータベースの形式があります。
これらのRDBMSにおいて、データベースを操作するための言語がSQLです。

> select * from datatable
> where "地物" Not like '豊橋'

という構文もSQLです。OpenOfficeのBaseは使ったことがなくてわかりませんが、こうしたSQLが利用できるならRDBMSの一つだと思います。

これはSELECT文という構文ですが、こうした基本的なSQLは、SQLiteに限らず他のRDBMSでも同様に使うことができます。
ちなみに書き換えるにはUPDATE、新しくデータを挿入するにはINSERTという文をそれぞれ使います。

今回の回答で挙げたGeopackageはSQLiteというデータベースの形式でしたが、読み込んだデータがPostgreSQLやMySQLの形式のデータベースだったとしても、同様の書き方でプロバイダ地物フィルタが利用できると思います。(もしかしたらLIKEの使い方や、NULLの判定の作法が少し違うかもしれませんが…。)
Reply all
Reply to author
Forward
0 new messages