SQL

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

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

NULLIF 関数の実用的な使い方

SQL

NULLIF 関数って動作の説明は多いけど、それを何に使えばいいのかってあんまり理解されてないんじゃないかと思う。 ってことで、NULLIF 関数の実用的な使い方をいくつか紹介する。 NULLIF 関数の動作 まずは、NULLIF 関数の動作から。 NULLIF 関数は引数を 2…

SQL を読みやすくするたった 2 つの方法

SQL

ちゃんとフォーマット*1する 共通表式もしくはビューを使う これだけ。 つかこれくらいやってくださいマジで。 *1:インデント及び改行

SQL の命名規約とフォーマット

SQL

ときどきの雑記帖さん経由で、私のSQLフォーマットをみて、自分の規約もさらしてみる*1 *2。 命名規約 テーブルやビュー、共通表式は Pascal 記法で、複数形とする*3。例えば、Employees とか Works とか ただし、リレーションテーブルはその限りではない。…

Hmmss 形式の数値を datetime に変換 (SQL Server)

SQL

そもそも数値で日付やら時間やら持つって一体どういうことかと問い詰めたいけど、それは置いておいて。 SELECT CONVERT( datetime , RIGHT('00' + CAST(col / 10000 AS varchar(2)), 2) + ':' + RIGHT(CAST(col / 100 AS varchar(4)), 2) + ':' + RIGHT(CAST…

SELECT *

SQL

一ヶ月くらい前かそれよりもう少し前に、“SELECT * するようなプログラムを書くなボケ” (超意訳)的な主張をしている web ページを読んだのだけど(英語でしたが)、 実際のところどうなんでしょうか。自分はそのページにあった、* でまとめて持ってきてからご…

大きいテーブルをスキャンしないようにする

SQL

BigTableは一日最大1000件のペースで増えていく nameを持つが、重複がかなり多い SmallTableは200〜300件のデータ量 nameを持つが、重複は存在しない(PK) SmallTableの一覧をGUIに表示する必要がある ただし、BigTableにnameが同じデータがある場合、マーク…

抜けのない連番を振る

SQL

パフォーマンスは無視する方向で。あとSQL Serverでしか試してない。 no_misssing_seqに抜けのない連番を格納することにする DBに挿入された相対時間を判定するために、自動採番されるidを使用 INSERT時には未確定データと言うことで、-1を入れておく INSERT…

採用試験に挑戦!

SQL

採用試験に挑戦 - 気楽に諸々をみて自分でもやってみたよ。SQL*1で。 問題:座標のグリッド揃え きれいにそろった図形というのはきれいな物です。 図形をそろえる上で、グリッド揃え等が必要になったりするでしょう。 これには座標をある一定のグリッド間隔…

SUMの結果がNULLのこともある

SQL

空集合に対しては、NULLを返します。また、NULL値だけの集合は空集合になりますので、やはりNULLを返します。 プログラマのためのSQL第2版 と言うことで、NULLの代わりに0を返してほしければ、 SELECT COALESCE(SUM(hoge), 0) FROM ... とする・・・んだけど…