仕事メモとか

仕事中に調べた情報とか知ったことをメモしています。
unixコマンド, vim, oracle, putty, postgresql, bash, EXCEL, python, SQL全般 など。
最近は tableau, movabletype とかも触ったりしています。
雑な読書感想とかはこちら

カテゴリ: SQL

複数insertを1つに纏めるinsert all

使う機会が地味にありそうでないので、毎回忘れそうなのでメモ。

insert all
into table_name values (1, 'data1')
into table_name values (2, 'data2')
into table_name values (3, 'data3')
select * from dual;

こんな感じで1つに纏まります。
テーブルカラムに全部データを入れない場合はvaluesの前に指定すること。

mysqlだともうちょっと簡単っぽい。

参考:
https://qiita.com/mkoba_6/items/dcd53aa10b08b8d81211
https://www.techscore.com/tech/sql/SQL11/11_01.html/
https://neos21.hatenablog.com/entry/2016/06/09/000000 
このエントリーをはてなブックマークに追加


oracleの正規表現で少しハマった話_REGEXP_REPLACE

URLを含むjsonの一部のデータを抜き出したい、ってことよくありますよね。
そういうときに力を発揮するのが正規表現。

なんですが、どうも上手くいかなくて苦労した話です。
結果的に上手くいったんですが。

例)
データ:[{"url":"https://data.net/dat/?data_id=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
...

後ろは延々と続きます。
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
のデータ部分が抜き出したいものです。
jsonに入ってるので、いろんなデータがありますが、このデータ自体は幸いjsonでも頭のほうに入っていました。

で、成功したSQLはこちら。

select regexp_replace(data_json, '.*sid=(.+?)\".*', '\1') as out_data
from data_table;

これで上手くいきました。


そして、失敗したのがこちら。

select regexp_replace(data_json, '.*sid=(.*?)\".*', '\1') as out_data
from data_table;

はい、取ってくる中を+から*に変更したものです。
原因はちゃんと見てないのですが、0件で最短マッチが成立してしまって上手く動かなかったのかな? と。
データ自体は必ず入っているのが確定しているデータなので今回はこれで困らないのですが、
もうちょっと原因が分かったほうがいい気が。



参考:
https://docs.oracle.com/cd/E16338_01/appdev.112/b56259/adfns_regexp.htm#CHDDGICJ
このエントリーをはてなブックマークに追加


oracle SQL Developer で文字をエスケープしようとしたときの話

はい、ちょっと環境が変わってSQL Developer使っています。
SQLで文字列を出すときに&(の半角)みたいなのって特殊文字扱いになるのですが、

select 'aaa & bbb' as dat from dual;

とすると、
「BBB:を入力せよ」みたいになります。
空で実行すると、こうなります。

aaa null

&BBBと解釈され、空がnullになるのでこうなったようです。

ちなみに、DBeaverで実行すると普通に実行されるので、
oracleとかSQLの仕様じゃなく、SQL Developerの仕様のようです。

それじゃエスケープすればいいのかな、と。思ってバックスラッシュとかいろいろやってみました。

select 'aaa \& bbb' as dat from dual;
select 'aaa && bbb' as dat from dual;
select '{aaa & bbb}' as dat from dual;

が、ダメでした。

調べた結果、以下の方法くらいしかなさそうでした。


1.&の後ろに文字指定をしない(後ろを別文字列として結合)
select 'aaa &' || ' bbb' as dat from dual;

2.設定変更
SET DEFINE OFF

3.chr(38)で出す
select 'aaa ' || chr(38) || ' bbb' as dat from dual;


ツールでちょっと見たい、が、作ったSQLを他でも流用したい、
みたいなときは、chr(38)にしておくと無難かと思います。



参考:
http://output-place.blogspot.com/2013/05/sqlplus.html
https://code-examples.net/ja/q/115aca
このエントリーをはてなブックマークに追加


SQLで正規表現でタブとか改行とか制御文字全般を削除する方法

chr(9) chr(10) chr(13)
とか呪いのように削除していましたが、
そもそも制御文字全般を消してしまえばよいのでは? ということで調べたら普通にありました。

[[:cntrl:]]

ということで、こいつを使うと簡単に行けました。

例:

select regexp_replace(dat, '[[:cntrl:]]', null)
from table

こんなに簡単になりました。



参考:
https://www.saka-en.com/oracle/sql-crlf-tab-delete-or-replace/
このエントリーをはてなブックマークに追加


postgresqlでoracleのminusみたいなものを探したら、あった(except)

はい、もうタイトルのままなんですが、
postgresqlでは呼び方が変わっていました。

正確にはoracleがminusで、
postgresqlとSQLserverがexceptという表記法でした。
使い方は両方一緒なので、とても簡単。

select aaa from table1
minus
select aaa from table2

これで、table1に居るなかで、table2に居る人を除外(差集合)となります。
なにかの調査の時に、割と切り出しを行うためにminusを使ったりするので(あんまり正式な調査としては良くないのですが)、
最初ないのかな? と思ったけど、あってよかった。


参考:
http://www.sql-reference.com/select/except_minus.html
このエントリーをはてなブックマークに追加

↑このページのトップヘ