に変換しLEFT JOIN
た後、にしようとしています。このような:CHAR
INT
SELECT o.title, d.title FROM original o
LEFT JOIN directory d ON CONVERT(o.directory_index, UNSIGNED INT) = d.index
インデックスがゼロより大きい場合、これにより正しい応答が得られます。しかし、インデックスがゼロまたは空の文字列の場合、すべてのディレクトリ タイトルの行が重複します。
o.title (o.index) d.title (d.index)
"Big Boss" "2" "OUTER HEAVEN" 2
"Snake" "0" "FOX" 0
"Snake" "0" "FOXHOUND" 1
"Snake" "0" "OUTER HEAVEN" 2
"Kerotan" "" "FOX" 0
"Kerotan" "" "FOXHOUND" 1
"Kerotan" "" "OUTER HEAVEN" 2
そこでCOALESCE
、すべての空の文字列をNULL
値に変換するステートメントを追加しました。
SELECT o.title, d.title FROM original o
LEFT JOIN directory d ON CONVERT(
CASE WHEN COALESCE(o.directory_index, '') = '' THEN NULL ELSE o.directory_index END,
UNSIGNED INT
) = d.index
COALESCE
ステートメントは正しい応答を返します (関数の出力を単独でテストしました) が、NULL
インデックスが に設定されていない限り、すべてのディレクトリ タイトル0
を取得するようになりました。この場合、以前と同じ結果が得られます。
o.title (o.index) d.title (d.index)
"Big Boss" "2" NULL 2
"Snake" "0" "FOX" 0
"Snake" "0" "FOXHOUND" 1
"Snake" "0" "OUTER HEAVEN" 2
"Kerotan" "" NULL 0
"Kerotan" "" NULL 1
"Kerotan" "" NULL 2
私は何を間違っていますか?
示唆されたように、私はステートメントを取り除き、COALESCE
ステートメントに置き換えましたNULLIF
:
SELECT o.title, d.title FROM original o
LEFT JOIN directory d ON CONVERT(
NULLIF(o.directory_index, ''),
UNSIGNED INT
) = d.index
しかし、私はCOALESCE
声明を持っているかのように同じ結果に遭遇します。
私が提供した例のフィドルを作成しましたが、奇妙なことに、それは私の望ましい結果をもたらします。しかし、これは Workbench で得た結果ではありません。サーバーは古いバージョンの MySQL (5.1 だと思いますか?) を実行していますが、それが問題でしょうか?
わかりました...だから私はかなり恥ずかしいです。昨日は一日中壁に頭をぶつけていました。それから私は今朝来てそれを見てみると、あるべきものがLEFT JOIN ... ON ... = d.index
に設定されていたことがわかりましたLEFT JOIN ... ON ... = d.title
。このスレッドの全員に賛成票を投じます。しかし、皆さんが私に反対票を投じるか、質問をクローズするようにマークしてください。