回答編集履歴

4

推敲

2020/10/26 02:23

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -22,7 +22,9 @@
22
22
 
23
23
  解説:
24
24
 
25
+ ・シーケンス値を(1-999)の範囲に分割する
26
+
25
- ・シーケンス値を(1-999)の範囲に分割する※シーケンス値は0開始にはできないので1始まりとし、-1で調整
27
+ ※シーケンス値は0開始にはできないので1始まりとし、-1で調整
26
28
 
27
29
  ・分割した値をA-Z(アルファベット26文字)で分割しChr()を使用してアルファベットに変換
28
30
 
@@ -30,7 +32,7 @@
30
32
 
31
33
 
32
34
 
33
- 厳密さで言うと、nextval()とcurrval()の処理間で他のトランザクションでnextval()が使用されるとずれます。
35
+ 尚、厳密さで言うと、nextval()とcurrval()の処理間で他のトランザクションでnextval()が使用されるとずれます。
34
36
 
35
37
 
36
38
 

3

追記

2020/10/26 02:23

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -27,3 +27,43 @@
27
27
  ・分割した値をA-Z(アルファベット26文字)で分割しChr()を使用してアルファベットに変換
28
28
 
29
29
  ・nextval()で発番されたシーケンス値をcurrval()で取得し分割。その値を書式設定
30
+
31
+
32
+
33
+ ※厳密さで言うと、nextval()とcurrval()の処理間で他のトランザクションでnextval()が使用されるとずれます。
34
+
35
+
36
+
37
+ 以下の様なファンクションを利用した方が良いかもししれません。
38
+
39
+ ```SQL
40
+
41
+ create or replace function NumberingID() RETURNS text
42
+
43
+ AS $$
44
+
45
+ DECLARE
46
+
47
+ wSerial bigint:=nextval('serial')-1;
48
+
49
+ BEGIN
50
+
51
+ RETURN chr(((wSerial/999%26)+65)::int) || to_char(wSerial%999+1, 'FM000');
52
+
53
+ END;
54
+
55
+ $$
56
+
57
+ LANGUAGE PLpgSQL;
58
+
59
+ ```
60
+
61
+ ```SQL
62
+
63
+ create table Numbering_test (
64
+
65
+ ID text default NumberingID()
66
+
67
+ );
68
+
69
+ ```

2

推敲

2020/10/26 02:21

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -22,9 +22,7 @@
22
22
 
23
23
  解説:
24
24
 
25
- ・シーケンス値を(1-999)の範囲に分割する
26
-
27
- ・シーケンス値は0開始にはできないので1始まりとし、-1で調整
25
+ ・シーケンス値を(1-999)の範囲に分割する※シーケンス値は0開始にはできないので1始まりとし、-1で調整
28
26
 
29
27
  ・分割した値をA-Z(アルファベット26文字)で分割しChr()を使用してアルファベットに変換
30
28
 

1

推敲

2020/10/26 02:09

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -28,6 +28,4 @@
28
28
 
29
29
  ・分割した値をA-Z(アルファベット26文字)で分割しChr()を使用してアルファベットに変換
30
30
 
31
- ・分割した値を書式設定
32
-
33
- ・nextval()で発番されたシーケンス値をcurrval()で取得
31
+ ・nextval()で発番されたシーケンス値をcurrval()で取得し分割。その値を書式設定