仕事メモとか

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

カテゴリ: SQL

bool_or と bool_and があるSQL

postgreSQLだけっぽいんですが、boolに関する便利な集約関数がありました。

超簡単説明:
bool_or : 内容が1つ以上trueならtrue
bool_and : 内容が全てtrueならtrue

はい、簡単ですね。

select bool_or(dat=1), bool_and(dat=1) from
(select 1 as dat union select 2 as dat) d_table

とやると、
bool_or はtrueが返り、
bool_and は2があるからfalseが返ります。

ハマると結構便利。

参考:
https://www.postgresql.jp/document/8.0/html/functions-aggregate.html 
このエントリーをはてなブックマークに追加

 ORA-00933: SQL command not properly ended が出た

いやもう、すごい簡単な話なんですが。
もらったSQLを実行してみたらなんかエラーになりました。
エラーコードはSQLコマンドが終了してないよ、っていうやつ。

SQLを良くみると、1つだけシングルコーテーションが違う。


update {table}
set a = 'a data'
      , b = ’b data’ ←ここだけ文字が良くみると違う
where c = 'c data'

みたいに、良く見ないとわからない状態になっていました。
こういうのはSQLツールで色分けしていると確かにわかりやすいので、
一旦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
このエントリーをはてなブックマークに追加

↑このページのトップヘ