タグ付けされた質問 「cast」

3
count()を使用してパーセンテージを決定するPostgreSQL(キャストの問題)
次のクエリを実行してpatients、refinst列の値を持つテーブル内の行の%を提供しようとしています。結果が0のままになります。 select (count (refinst) / (select count(*) from patients) * 100) as "Formula" from patients; テーブルには15556行あり、そのうち1446行が列にselect count(refinst) from patients値を持っていることがわかりrefinstます。クエリから取得したい応答は30.62(1446/15556*100=30.62XXXXX小数点以下2桁に丸められます)になります。 カウント結果のデータ型(私が想定している整数)と関係があると確信しています。整数を整数で除算し、結果が0未満の場合、0に切り捨てられますか?その場合、カウントの結果を小数点以下2桁の数値としてキャストして、結果も小数点以下2桁に丸める方法を教えてもらえますか? このコードを書くには、複数のcountステートメントよりも良い方法があると確信しています。特にこのクエリを書くための、よりプロセッサ効率の良い方法を探しています。
19 postgresql  count  cast 

1
ctidをページ番号と行番号に分解するにはどうすればよいですか?
テーブルの各行には、行の物理的な場所を表すタイプのシステム列が ctidありますtid。 create table t(id serial); insert into t default values; insert into t default values; select ctid , id from t; ctid | id :---- | -: (0,1)| 1 (0,2)| 2 ここに dbfiddle ctid最も適切なタイプ(例えばinteger、bigintまたはnumeric(1000,0))からページ番号だけを取得する最良の方法は何ですか? 私は考えることができる唯一の方法は非常に醜いです。

1
SQL ServerでBase64文字列をネイティブにデコードする
私が持っているvarchar、私はそれのプレーンテキスト同等にデコードしたいBase64でエンコードされたテキスト文字列を保持するSQL Serverのテーブルのカラムを SQL Serverには、このタイプのものを処理するためのネイティブ機能がありますか? base64文字列の例: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== デコードするもの: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

1
PostgreSQLでのJSONBのクエリ
私は、テーブルを持つpersons2つの列が含まれている、idとJSONBベースのdata列を(この表は単なるPostgreSQLのJSONサポートで遊んする実演目的のために作られました)。 ここで、2つのレコードが含まれていると想定します。 1, { name: 'John', age: 30 } 2, { name: 'Jane', age: 20 } ここで、25歳以上のすべての人の名前を取得したいとします。私が試したのは次のとおりです。 select data->'name' as name from persons where data->'age' > 25 残念ながら、これはエラーになります。の->>代わりにを使用して解決でき->ますが、数値は比較されないため、比較は期待どおりに機能しなくなりますが、文字列としての表現: select data->'name' as name from persons where data->>'age' > '25' 次に、を使用->してキャストすることで問題を実際に解決できることがわかりましたint: select data->'name' as name from persons where cast(data->'age' as int) > …

1
型修飾子を使用したデータ型の驚くべき結果
この質問に対する再帰的なCTEソリューションについて説明しながら: 各IDの最後の5つの異なる値を取得する @ypercubeは驚くべき例外に出くわし、型修飾子の処理を調査することになりました。私たちは驚くべき行動を見つけました。 1.型キャストは、一部のコンテキストで型修飾子を保持します しないように指示された場合でも。最も基本的な例: SELECT 'vc8'::varchar(8)::varchar 一つは、期待していないかもしれないvarchar私は、少なくとも、(無修正)でしょう。しかし、結果はvarchar(8)(修飾子付き)です。以下のフィドルで関連する多くのケース。 2.配列の連結により、一部のコンテキストで型修飾子が失われる 必要がないので、これは反対側でエラーになります: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) 最初の式はvarchar(8)[]期待どおりに生成されます。 しかし、2番目は、連結した後、別のものvarchar(8)がvarchar[]修正されます(修飾子なし)。からの同様の動作、array_append()以下のフィドルの例。 このすべては、ほとんどの状況で重要ではありません。Postgresはデータを失わず、列に割り当てられると、値はとにかく正しい型に強制されます。ただし、反対方向にエラーを発生させると、驚くべき例外が発生します。 3.再帰的なCTEは、完全に一致するデータ型を要求します この単純化されたテーブルを考えると: CREATE TABLE a ( vc8 varchar(8) -- with modifier , vc varchar -- without ); INSERT INTO a VALUES ('a', 'a'), ('bb', 'bb'); このrCTEはvarchar列に対しては機能しvcますが、varchar(8)列に対しては失敗しますvc8。 WITH RECURSIVE cte AS ( …

1
なぜ列型にNULLをキャストする必要があるのですか?
大量の更新を行うためのコードを生成し、次のようなSQLを生成するヘルパーがあります。 (アクティブフィールドとコアフィールドの両方がタイプですboolean) UPDATE fields as t set "active" = new_values."active","core" = new_values."core" FROM (values (true,NULL,3419), (false,NULL,3420) ) as new_values("active","core","id") WHERE new_values.id = t.id; しかしそれは失敗します: ERROR: column "core" is of type boolean but expression is of type text ::booleannullに追加することで機能させることができますが、奇妙に思えますが、なぜNULLは型と見なされますTEXTか? また、どの型にNULLをキャストするかを知るためにコードを再調整する必要があるため、キャストするのは少し難しいです(現在、列と値のリストは、JSONオブジェクトの単純な配列から自動生成されています)。 。 なぜこれが必要なのですか?NULLのタイプを知るために生成コードを必要としない、よりエレガントなソリューションがありますか? それが適切であれば、Node.JSでsequelizeを使用してこれを行いますが、Postgresコマンドラインクライアントでも同じ結果が得られます。
10 postgresql  null  cast 

2
PostgreSQLでは、1バイトの「char」型はどの程度正確に機能しますか?
私はよく人が話して"char"いるのを見ます。使ったことがない。それはドキュメントで次のように定義されています: タイプ「char」(引用符に注意)は、1バイトのストレージのみを使用するという点でchar(1)とは異なります。これは、単純な列挙型としてシステムカタログで内部的に使用されます。 そしてさらに、 "char" 1 byte single-byte internal type それで、それが1バイトである場合、ドメインは何であり、どのようにそれを利用しますか?署名されていますか、署名されていませんか?@Erwin Brandstetterによるこの投稿では、彼はそれをレイアウトしていますが、私はまだ混乱しています。彼はand を使用してascii()おりchr()、これを提供しています SELECT i , chr(i)::"char" AS i_encoded , ascii(chr(i)::"char") AS i_decoded FROM generate_series(1,256) i; それは10から11の間で本当に奇妙なことをしています。 i | i_encoded | i_decoded -----+-----------+----------- ... 8 | \x08 | 8 9 | | 9 10 | +| 10 | | -- WTF …

2
これがBIGINT colでシークするのに、追加の定数スキャン、計算スカラー、ネストされたループ演算子があるのはなぜですか?
一部のクエリの実際の実行計画を見ると、WHERE句で使用されているリテラル定数が、スカラー計算と定数スキャンのネストされたチェーンとして表示されていることに気づきました。 これを再現するには、次の表を使用します CREATE TABLE Table1 ( [col1] [bigint] NOT NULL, [col2] [varchar](50) NULL, [col3] [char](200) NULL ) CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC) その中にいくつかのデータがあります: INSERT INTO Table1(col1) VALUES (1),(2),(3), (-9223372036854775808), (9223372036854775807), (2147483647),(-2147483648) 次の(ナンセンス)クエリを実行すると: SELECT a.col1, a.col2 FROM Table1 a, Table1 b WHERE b.col1 > 2147483648 インデックスシークとスカラー計算(定数から)の結果で、ネストされたループの描画を行うことがわかります。 リテラルがmaxintよりも大きいことに注意してください。それは書くのに役立ちますCAST(2147483648 as …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.