に変換しLEFT JOINた後、にしようとしています。このような:CHARINT
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。このスレッドの全員に賛成票を投じます。しかし、皆さんが私に反対票を投じるか、質問をクローズするようにマークしてください。