0

PostgresqlDBを使用しています。

テーブルの数値列に対してクエリを実行して、値が特定の数値で始まっているかどうかを確認したいと思います。

私は現在持っています:

SELECT * FROM myTable WHERE to_char(ID, '12345678') LIKE '2%'

ただし、これは空のデータセットを返します(ただし、ID列には2で始まる値があります。

どうもありがとう

スティーブ

4

5 に答える 5

3

これは、の数値のパターンが(指定された桁数の値)または(先行ゼロの値)のTO_CHARいずれかであるためです。次のいずれかを使用します。90

SELECT * FROM myTable WHERE TRIM(to_char(ID, '99999999')) LIKE '2%'

または、数値を文字にキャストします。

于 2012-09-16T16:19:36.000 に答える
2

笑わないでください。キャストの代わりに、次のような範囲クエリを使用できます。

SELECT * FROM mytable
WHERE id = 2
OR (id >=20 AND id < 30)
OR (id >=200 AND id < 300)
OR (id >=2000 AND id < 3000)
OR (id >=20000 AND id < 30000)
OR (id >=200000 AND id < 300000)
OR (id >=2000000 AND id < 3000000)
OR (id >=20000000 AND id < 30000000)
OR (id >=200000000 AND id < 300000000)
OR (id >=2000000000 AND id < 3000000000)
OR (id >=20000000000 AND id < 30000000000)
OR (id >=200000000000 AND id < 300000000000)
        -- ...
        ;

これにより、postgresがはるかに優れたクエリプランを生成する可能性があります。これは、インデックスを使用できるためです(存在する場合、idフィールドに期待できます)。

更新:クエリプラン:

Bitmap Heap Scan on reservations  (cost=1838.15..13290.11 rows=110809 width=4012) (actual time=11.310..24.379 rows=111111 loops=1)
   Recheck Cond: ((id = 2) OR ((id >= 20) AND (id < 30)) OR ((id >= 200) AND (id < 300)) OR ((id >= 2000) AND (id < 3000)) OR ((id >= 20000) AND (id < 30000)) OR ((id >= 200000) AND (id < 300000)) OR ((id >= 2000000) AND (id < 3000000)) OR ((id >= 20000000) AND (id < 30000000)) OR ((id >= 200000000) AND (id < 300000000)) OR ((id >= 2000000000) AND (id < 3000000000::bigint)) OR ((id >= 20000000000::bigint) AND (id < 30000000000::bigint)) OR ((id >= 200000000000::bigint) AND (id < 300000000000::bigint)))
   ->  BitmapOr  (cost=1838.15..1838.15 rows=112192 width=0) (actual time=11.242..11.242 rows=0 loops=1)
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..1.49 rows=1 width=0) (actual time=0.005..0.005 rows=1 loops=1)
               Index Cond: (id = 2)
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..1.58 rows=10 width=0) (actual time=0.003..0.003 rows=10 loops=1)
               Index Cond: ((id >= 20) AND (id < 30))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..2.52 rows=104 width=0) (actual time=0.013..0.013 rows=100 loops=1)
               Index Cond: ((id >= 200) AND (id < 300))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..14.24 rows=1036 width=0) (actual time=0.110..0.110 rows=1000 loops=1)
               Index Cond: ((id >= 2000) AND (id < 3000))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..144.73 rows=10845 width=0) (actual time=1.050..1.050 rows=10000 loops=1)
               Index Cond: ((id >= 20000) AND (id < 30000))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..1332.24 rows=100196 width=0) (actual time=10.013..10.013 rows=100000 loops=1)
               Index Cond: ((id >= 200000) AND (id < 300000))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..1.49 rows=1 width=0) (actual time=0.010..0.010 rows=0 loops=1)
               Index Cond: ((id >= 2000000) AND (id < 3000000))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..1.49 rows=1 width=0) (actual time=0.001..0.001 rows=0 loops=1)
               Index Cond: ((id >= 20000000) AND (id < 30000000))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..1.49 rows=1 width=0) (actual time=0.001..0.001 rows=0 loops=1)
               Index Cond: ((id >= 200000000) AND (id < 300000000))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..1.49 rows=1 width=0) (actual time=0.002..0.002 rows=0 loops=1)
               Index Cond: ((id >= 2000000000) AND (id < 3000000000::bigint))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..1.49 rows=1 width=0) (actual time=0.026..0.026 rows=0 loops=1)
               Index Cond: ((id >= 20000000000::bigint) AND (id < 30000000000::bigint))
         ->  Bitmap Index Scan on reservations_pkey  (cost=0.00..1.49 rows=1 width=0) (actual time=0.002..0.002 rows=0 loops=1)
               Index Cond: ((id >= 200000000000::bigint) AND (id < 300000000000::bigint))
 Total runtime: 28.720 ms
(28 rows)


 Seq Scan on reservations  (cost=0.00..19219.52 rows=4383 width=4012) (actual time=0.025..184.532 rows=111111 loops=1)
   Filter: ((id)::text ~~ '2%'::text)
 Total runtime: 189.100 ms
(3 rows)
于 2012-09-16T16:50:53.667 に答える
2

これにより、先頭の数字が返されます。

floor(a/10.^(floor(log(a))))

例:

select a from generate_series(1,1000) as a where 
    floor(a/10.^(floor(log(a)))) = 2;

1より小さい、または0より小さい数値がある場合は、それらをフィルターで除外する必要があります(正確に何が必要かによって異なります)。

于 2012-09-16T16:52:34.347 に答える
0

私は答えを見つけました:

SELECT * FROM myTable WHERE CAST (ID AS CHAR) LIKE '2%'

スティーブ

于 2012-09-16T16:19:29.320 に答える
-1

あなたはto_char、ただ、必要はありませんid like '2%'

于 2012-09-16T16:15:51.097 に答える