読者です 読者をやめる 読者になる 読者になる

SQLアンチパターン

献本いただきました。ありがとうございます。 当たり前を当たり前にできる可能性を秘めた本 この本の素晴らしいところは、よく見る「悪い」方法を、「悪いこと」としてまとめてくれたことです。 今までは、筋のよくない設計やSQLを考え直してもらうためにあ…

生島さんが考える最強の言語 SQL

SQL

生島さんが誰と闘っているのか知らないけど、ちょっと気になることをつらつらと。SQLは最も高級言語 - SQLer 生島勘富 の日記 SQLは最も高級言語2 - SQLer 生島勘富 の日記 SQLとはなんぞや? - SQLer 生島勘富 の日記 高級*言語* どうも生島さんは、「SQL …

SQL (再帰 CTE) 基礎文法 (?) 最速マスター

SQL

なんか流行ってるらしいので。 他の言語をある程度知っている人はこれを読めば SQL (再帰 CTE) の基礎をマスターして SQL (再帰 CTE) を書くことができるようになります。 ・・・嘘ですごめんなさい。 ぜんてい いつもの通り、SQL Server 2005/2008 でしか試…

再帰の上限設定

SQL

SQL Server では、何も指定しない場合、再帰の上限は 100 が使用される。 これを変更するためにはクエリヒントとして MAXRECURSION を指定する。 WITH Seq(n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM Seq WHERE n < 150 ) SELECT * FROM Seq OPTION (MAX…

1 から 10 までの自然数の合計を出すプログラムを SELECT 文のみを使って書きなさい

SQL

ただし入力は始点と終点のみとし、他の数値は適当に生成すること。元ネタ:1から10までの自然数の合計を出すプログラムをプリプロセッサを使って書きなさい - 危ないRiSKのブログ WITH Input(from_, to_) AS (SELECT 1, 10) , Inputs(i, n) AS ( SELECT from…

FizzBuzz

SQL

まずは FizzBuzz から。 思いついたままに書いただけなので色々とアレ。 WITH Input(n) AS (SELECT 100) , FizzBuzz(n, fizz, buzz, fizzbuzz, max_n) AS ( SELECT 1 , CAST(NULL AS varchar(max)) , CAST(NULL AS varchar(max)) , CAST(NULL AS varchar(max…

今日ぽちった本

SQL/RDB オンリーJoe Celko's Trees and Hierarchies in SQL for Smarties (The Morgan Kaufmann Series in Data Management Systems)作者: Joe Celko出版社/メーカー: Morgan Kaufmann発売日: 2004/05/21メディア: ペーパーバック クリック: 14回この商品を…

NULLIF 関数の実用的な使い方 その 2

SQL

NULLIF 関数の実用的な使い方の続編。短いけど。 友人 mi とチャットしていて、NULLIF 関数の実用的な使い方を一つ思いついた。 @a にはユーザの入力がバインドされるとして (SQL Server ですね)、 SELECT ... FROM ... WHERE NULLIF(@a, a) IS NULL ; とす…

SQL Server に望むこと その 1

SQL Server は文字列の連結に「+」を使ってるんだから、文字列の繰り返しに「*」が使えて欲しい。 REPLICATE 関数とかいらない。 SQL Server は文字列の連結に「+」を使ってるんだから、SUM に文字列渡せるようになって欲しい。 再帰 CTE とかだるい。 ただ…

Excel を使って SQL をリファクタリング

結果が変わっていないことを確認しながら SQL をリファクタリングするために、EXCEL - マクロ・シート間の照合 - Office系ソフト - 教えて!gooを参考にマクロを組んでみた。 Function HasDiff_Expect_Actual() As Boolean HasDiff_Expect_Actual = False ' …

SQL/RDB っぽい本を積んでみた

内容はまた後で。 タイトルしかないものは「他にいい本があるか古い」、それ以外はそれ以外です。 RDBMS にあまり依存しない 【改訂第3版】 SQLポケットリファレンス (POCKET REFERENCE)作者: 朝井淳出版社/メーカー: 技術評論社発売日: 2009/04/29メディア:…

(普通の) 再帰 CTE を hierarchyid で

SQL

SQL Server 2008 に実装されている hierarchyid 型は、経路列挙モデルをベースにした型なので、再帰 CTE を置き換えることができる。 例えば、 SQL Server 2005で再帰クエリ - taediumの日記 の再帰 CTE を hierarchyid で実現してみる。 使用するテーブル C…

インデント

SQL

SQL の命名規約とフォーマットの続き・・・になるのかな。 SQL には終了タグはないけど SELECT 文以下はまとまりになっているから、インデントしたほうが自然に感じる。基本的には SQLプログラミング作法 に従ってるけどそこは好みかな。 ... <SELECT> <select-list> * </select-list> <FROM> emp </FROM> <WHERE> id</where></select>…

ソートしていいなら・・・

SQL

あと SQL Server の独自拡張使っていいなら・・・ SELECT MAX(T.n) FROM (SELECT TOP 10 n FROM Input ORDER BY n) T 激速。どれくらい早いかというと、上の SQL が 1 万件のデータに対してそれぞれ 36 秒、26 秒かかるのに対して、このバージョンは 1 秒未…

ソートせずに小さい方から n 番目を見つけ出す その 2

SQL

SELECT P.n FROM Input P WHERE (SELECT COUNT(*) FROM Input C WHERE C.n <= P.n) = @n SQL Server だとこっちの方が高速。

ソートせずに小さい方から n 番目を見つけ出す

SQL

stackoverflow から 「ソートをせずに、配列要素の値の小さい方から n番目を見つけ出す」 C Program to search n-th smallest element in array without sorting? - Stack Overflow Programming Pearls にこの種の話があったと思う。答えを見る前にちょっと…

どこまで知っていて欲しいか

SQL

これも線引きはとても難しいという結論しか出てこないんだけど、使うかどうかは別として、知識としてはある程度の深さまでは知っていて欲しい。 さすがに再帰 CTE までは要求しないけど、NULL に関する知識は必須と言っていい。 さらに、各種結合、ビューや…

極力 SQL だって?

SQL を使えば大抵のことは出来るけど、だからと言って極力 SQL でやる、ってのは間違ってると思う。 出来るからと言ってそれでやるのが適切かどうか、って話でもある。 ならここ最近のエントリはなんなんだ、って話だけど、あれは単なる遊びというか、頭の体…

注意を考慮したうえでの計算で求める総積

SQL

こんな感じ? WITH Input(id, n) AS ( SELECT 1, 1 UNION ALL SELECT 1, 2 UNION ALL SELECT 1, 3 UNION ALL SELECT 1, 0 UNION ALL SELECT 2, 1 UNION ALL SELECT 2, -2 UNION ALL SELECT 2, -3 UNION ALL SELECT 3, 1 UNION ALL SELECT 3, -2 UNION ALL SE…

計算で総積を求める際の注意点

SQL

項目の総積を求める。 - だらだらやるよ。あー、計算で総積を求める場合、注意しなければならない点が 2 つほどあります。 あ、ちなみに SQL Server では loge は log 関数を使います。で、log10 は log10 関数。 log 関連の関数には 0 や負の数が渡せない …

再帰 CTE に関する注意

SQL

ハンマーを手にしたら全てのものが釘に見えるってのは本当だと思う。 例えば、文字列から空白を取り除くために再帰 CTE を使うことも出来るけど、再帰 CTE を知らなかった頃なら REPLACE を真っ先に思い浮かべるはず。 再帰 CTE の使いどころとしては、テー…

10 分間コーディングで 30 分かかった SQL を読み下す

SQL

再帰 CTE の入門が済んだところで、10 分間コーディングで 30 分かかった・・・ - ぐるぐる〜を読んでみましょう! 読み方 上の CTE (Input) から下に向かって読んできます。 Input Input は簡単。 Input(id, numPlayers, deck) AS ( SELECT 1, 3, '12312312…

再帰 CTE で総積を求める (再帰 CTE の入門)

SQL

なんか「SQL かけ算」とかを検索してここに来ている人達がいるようなんだけど、総積でも求めたいのかな? 確かに、SUM はあるのに PRODUCT なんてないしなー。 てことで勝手にそういうことにして、再帰 CTE で総積を書いてみる。 RDBMS はもちろん (?) SQL S…

BrainCrash in SQL

SQL

Brainf*ck in SQL を改造して、BrainCrash in SQL を書いてみました! BrainCrash については 404 Not Found を参考にしてください。 WITH -- 入力 Input(id, bc_program, stdin) AS ( -- Hello, World!と標準出力に出力するプログラム SELECT 0, '', '' -- …

10 分間コーディングで 30 分かかった・・・

SQL

C#と諸々 10分でコーディング 10分でコーディング|プログラミングに自信があるやつこい!!乗り遅れた感はあるけど、SQL でやってみた。 WITH Input(id, numPlayers, deck) AS ( SELECT 1, 3, '123123123' UNION ALL SELECT 2, 4, '123123123' UNION ALL …

「以下について教えてあげよう♪」・・・SQL で

SQL

「以下について教えてあげよう♪」 - ...ing logging 3.0 経由、以下について教えてあげよう♪ 書いてみた。やっぱり SQL で。 WITH Input(id, str) AS ( SELECT 1, 'Abc012_59F_#012Gh' ) , Transform(id, res, input_str) AS ( SELECT id , CAST('' AS varch…

行持ち・列持ち (横持ち)

ちょっとまとめ。 行・列 行と列は漢字からイメージすると覚えやすい。例えば、以下のテーブル col_a col_b col_c col_d 1 2 3 4 5 6 7 8 なら、一行目は 1, 2, 3, 4 だし、三列目は 3, 7 となる。 列持ち (横持ち) では、列持ちとはどういうテーブルのこと…

SQL で数式を評価 (完全版 + α)

SQL

大阪で働く友人 mi との合作*1で不完全版が完全版に! やっぱり mi はすごかった!! WITH Input(id, str) AS ( -- idと数式を渡す SELECT 1, '1 + 3 / -8' UNION ALL SELECT 2, '2*3*4*5+99' UNION ALL SELECT 3, '4 * (9 - 4) / (2 * 6 - 2) + 8' UNION AL…

Brainf*ck in SQL

SQL

Brainf*ck はチューリング完全らしいですよ。 Brainf*ck 自体に興味のある方は、Brainf*ck や Brainfuck - Wikipedia へどうぞ。 WITH -- 入力 Input(id, bf_program, stdin) AS ( -- Hello, World!と標準出力に出力するプログラム SELECT 0, ' >+++++++++[<…

SQL で逆ポーランド記法の電卓

SQL

まだ未完成ですけど、もうほとんど完成してるのでさらしておきますね。 完成しました! 文字列でスタックを実現しています。 WITH Input(id, str) AS ( -- 1 + 3 / -8 SELECT 1, '1 3 + -8 /' -- 2*3*4*5+99 UNION ALL SELECT 2, '2 3 * 4 * 5 * 99 +' -- 4 …

SQL で数式を評価 (不完全版)

SQL

そういえば(このパターン多いな)、redditだかstackoverflowで、いろんな言語で文字列として与えられた数式をできるだけ短いコードで評価するってのがあったけど、SQLでできる?w Twitter / finalfusion: そういえば(このパターン多いな)、redditだかstack ...…

ケブンッリジ関数

SQL

Server errorもう何でもありです!

16 進数から 10 進数への変換

SQL

Server errorこれはひどい・・・

再帰 SQL のよりよいサンプル

SQL

Server error日付で再帰 SQL 説明するとか馬鹿げてる。数値型使え数値型、という話。 こっちならわけわかる・・・はず!

13 日の金曜日を求める SQL の解説

SQL

昨日書いた SQL、よくわからない認定を受けたのでちょっと解説しておきますね。 えー、書いた SQL はこんなのです*1。 WITH Cal(day/*, year*/) AS ( SELECT GETDATE() -- , YEAR(GETDATE()) UNION ALL SELECT DATEADD(dd, 1, day) -- , year FROM Cal WHERE…

13 日の金曜日

SQL

どう書く?.org初投稿。 Server error 再帰 WITH さえあれば、SQL って実は日付処理得意だと思うんだ。 カレンダーを再帰 WITH で作って、あとは欲しいものを WHERE でフィルタリングするだけ。 今回のやつは小計求める方法使って、無理矢理一番最後に個数を…

当月と当年の集計を同時に出す

SQL

取引先 当月売上合計 当年売上合計 aaa 350 1000 みたいに、当月と当年*1の集計を同時に行いたい場合、 SELECT T.cust_name AS N'取引先' , SUM(CASE MONTH(T.date) WHEN MONTH(GETDATE()) THEN T.sales ELSE 0 END) AS N'当月売上合計' , SUM(T.sales) AS N…

SQL Server Management Studio でテーブルのデザインを変更できるようにする

いつも忘れるのでメモ。 SQL Server 2008 の SQL Server Management Studio では、テーブルのデザインを変更しようとしても、 変更の保存が許可されていません。行った変更には、次のテーブルを削除して再作成することが必要になります。再作成できないテー…

複数の共通表式の使い方

SQL

「SQLクックブック ―データベースエキスパートのための実践レシピ集」を含むブログ - はてなキーワードで、自分のブログを除いて一番最近のブログのカテゴリ「SQL Server」を読んでびっくり。 はてなダイアリーとか、はてなダイアリーとか、それなんて今日の…

SQL Server では実は再帰 SQL が記述できた

SQL

SQL Server 2005 から共通表式が使えるのは知ってて、使いまくってたんだけど、再帰 SQL が使えるとは・・・ 新しい業界標準「SQL99」詳細解説をみると、再帰 SQL には RECURSIVE キーワードが必要っぽいんだけど、SQL Server では RECURSIVE キーワードを使…

SQL Server の LIKE では正規表現の文字クラスと否定文字クラスのようなものが使える

SQL

使えるんです。 SELECT * FROM SomeTable WHERE col LIKE 'etc[1-9]' AND col2 LIKE '[^0-9]%' ; みたいな感じで。 文字クラスの中では % も _ もそのままの文字として扱える。

数値の桁を制限した上で右寄せ (SQL Server 2005)

SQL

なんか numeric とか使うと、小数点以下の桁数指定しても無駄に 0 が出るアプリケーションでの話。 それはいやだということで、A さんが STR 関数使って、 SELECT STR(col, 16, 1) FROM ...; みたいにしてたんだけど、これだとそのアプリケーションでは左寄…

ちょっと変わった (?) 小計の求め方

SQL

小計行を出したい場合は ROLLUP やら CUBE やらを使うのが普通なんだろうけど、それらが使えない環境というものもあるわけで・・・*1 *2 で、効率無視してでも出したい場合、以下のように書けばいい。 -- 明細行と SELECT Customer.id , Customer.name , Ite…

とりあえず改良 LEN 関数 (U_LEN)

SQL

使う場合は自己責任で。 -- ============================================= -- Author: bleis-tift -- Create date: 2009/5/17 -- Description: サロゲート文字を考慮した文字列長を取得します。 -- ============================================= CREATE …

SQL Server の LEN 関数は文字列の長さを正確に取得出来ない・・・だけじゃない

SQL

サロゲート文字*1を含む文字列だと、LEN 関数正しい文字列長を取得出来ない。 -- このSQLを実行すると、1ではなく2が返される SELECT LEN(N'𠮷'); 注意:環境によっては□が表示されるかもしれないけど、実際はつちよし (吉の上が士じゃなくて土) です。 以下…

SQL Server で文字列を全部結合したいだけなら

SQL

以下のように記述すれば出来るっぽい。 DECLARE @str AS varchar(max); SET @str = ''; SELECT @str = @str + str FROM SomeTable; SELECT @str; 参考:文字列を集計的に結合する(ユーザー定義関数経由で GROUP BY 対応) カンマ区切りがしたければ、 DECLARE…

SQL Server で 文字列の SUM が取れない

SQL

SQL Server では文字列の結合に + を使うくせに、文字列の SUM が取れないのは悲しいよな・・・

SQL に FOLD があれば・・・

便利だと思うんだ*1 *2。 例えば、 -- 総積を求める SELECT n.FOLD(*, 1) FROM SomeTable; -- 文字列を全部結合 SELECT str.FOLD(||, '') FROM SomeTable; みたいな。 第二引数を省略すると一番最初の要素が使われる*3とかすると、上の例は -- 総積を求める …

【改訂第3版】 SQLポケットリファレンス

【改訂第3版】 SQLポケットリファレンス (POCKET REFERENCE)作者: 朝井淳出版社/メーカー: 技術評論社発売日: 2009/04/29メディア: 単行本(ソフトカバー)購入: 6人 クリック: 117回この商品を含むブログ (17件) を見るTwitter で、SQL ポケットリファレン…

SQL から構文木作るようなライブラリってないんだろうか

SQL

あったらテーブルとか条件が簡単に差し替えられるのに。