base フィールドに空白がある場合の文字の連結

baseのクエリでフィールドの文字列を連結させたいと思っています。

下記のように文字列を連結しています。
concat(”フィールド1”,”フィールド2”,・・・
しかしフィールドに空白があると、連結結果が空白になってしまいます。

http://oooug.jp/faq/index.php?faq%2F6%2F181

上記のサイトを見ると、+を使って連結すると、フィールドに空白がある場合に連結結果が空白になるが、
CONCAT(CONCAT( “フィールド1”, “フィールド2” ), “フィールド3” )
のようにすると回避できるというようなことが書いてありました。

しかし、その方法でもフィールドに空白があると、結果が空白になってしまいます。

空白があっても、連結結果が空白にならない方法はあるのでしょうか?

○COALESCEを使ってください。

○「空白」よりも「null値である」と言ったほうが明確か。てっきりU+0020とか空文字列かと思いそうになったorz

★SQL-92
●(Second Informal Review Draft) ISO/IEC 9075:1992, Database Language SQL- July 30, 1992
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

  1. COALESCE (V1, V2) is equivalent to the following <case

CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END

  1. COALESCE (V1, V2, . . . ,n ), for n >= 3, is equivalent to the following :

CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, . . . ,n ) END

○||はあるが、CONCATはそもそもない! Firebirdにもない。
○character string literalはシングルクオートで括るようだ。

★HSQLDB
●Chapter 10. Built In Functions
http://hsqldb.org/doc/guide/builtinfunctions-chapt.html#bfc_general_functions

COALESCE

COALESCE( <value expr 1>, <value expr 2> [, …] )

Returns <value expr 1> if it is not null, otherwise returns <value expr 2> if not null and so on. The type of both arguments must be comparable. (Foundation)

●同上
http://hsqldb.org/doc/guide/builtinfunctions-chapt.html#bfc_string_binary_functions

CONCAT

CONCAT ( <char value expr 1>, <char value expr 2> [, …] )

CONCAT ( <binary value expr 1>, <binary value expr 2> [, …] )

The arguments are character strings or binary strings. Returns a string formed by concatenation of the arguments. Minimum number of arguments is 2. Equivalent to the SQL concatenation expression <value expr 1> || <value expr 2> [ || …] .

Handling of null values in the CONCAT function depends on the database property sql.concat_nulls ( SET DATABASE SQL SYNTAX CONCAT NULLS { TRUE || FALSE } ). By default, any null value will cause the function to return null. If the property is set false, then NULL values are replaced with empty strings. (いつ指定するのか確信が持てない。これ自体はテーブルとしての結果を返さないという趣旨のエラーが出た)

○オマケ(当方環境ではGUIでうまくいかない。Javaから呼ばないと駄目?)
(JDBC)

CONCAT_WS

CONCAT_WS ( , <char value expr 1>, <char value expr 2> [, …] )

The arguments are character strings. Returns a string formed by concatenation of the arguments from the second argument, using the separator from the first argument. Minimum number of arguments is 3. Equivalent to the SQL concatenation expression <value expr 1> || || <value expr 2> [ || …] . The function ignores null values and returns an empty string if all values are null. It returns null only if the separator is null.

This function is similar to a MySQL function of the same name.

★Firebird
CONCATという関数自体ありません。使えません。演算子を使え、ということですね。
http://firebirdsql.org/refdocs/langrefupd25-intfunc.html
なのだが、
http://firebirdsql.org/refdocs/langrefupd25-concat.html
演算子の引数がNULLだった場合の記述がないorz
辛うじて見つけたのが以下。
http://www.firebirdfaq.org/faq21/

●COALESCE() は当然ある。
http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-functions-scalarfuncs.html#fblangref25-functions-scalarfuncs-coalesce

Description: The COALESCE function takes two or more arguments and returns the value of the first non-NULL argument. If all the arguments evaluate to NULL, the result is NULL.

○オマケ
http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-background.html
Dynamic SQL (DSQL)
Procedural SQL (PSQL)
Embedded SQL (ESQL)
Interactive SQL (ISQL)

P.S. 画像に必要な3ポイントってどこで獲得できるのかなあ…折角撮ったんだけどなあ…

あるんですね!
ありがとうございます!やってみます!