2016-10-20 14 views
1

このデータベースは私のものではありませんので、残念ながらそれを単一の名前の列に変更することはできません。oracle sql名前を3列に分割する方法を教えてください。

**table1:** 

name1,name2,name3 
john,mega,rambo 
john,master,travolta 
john,super,connor 

私は「私はそれは、Oracleデータベースを照会し、名前を返すようにしたいアヤックス file.php?QS =ジョン%のランボー

からPHPファイルにジョンのMEGAをクエリ文字列$適量を送信していますランボー」ので、私はこれが働くだろうと思ったが、それはしません。

SQL:

SELECT CONCAT(CONCAT(name1,name2),name3) as name 
    FROM table1 
WHERE name LIKE '%{$qs}%' 

私は最大を推測ここでの問題は、誰かがname1またはname2/name1またはname3で検索できることです。何か案は ?

+2

にORACLE

SELECT CONCAT(CONCAT(name1,name2),name3) AS name FROM table1 HAVING name LIKE '{%$qs}%' 

:私はOracleとMySQLの両方のソリューション

MySQLを投稿します。コードがどのように動作しないか、どのようなエラーがスローされるかなどの説明は非常に役に立ちます。あなたが投稿したコードには構文エラーがありますが、それを確認するエラーメッセージは表示されません。あなたが転写エラーを起こしたかどうかを知ることは本当に難しいです。 –

+1

"それは動作しません"一般的にあまり有用ではありません、実際のエラーや誤った動作を提供してください。あなたのテーブルには 'name'カラムはありません。 3つの列のいずれかに存在する値を検索したいと思うようですが、最後の段落が意味することはわかりません。列の組み合わせが示唆されていますか? –

+0

あなたはそれについて正しいです、私は質問を投稿する次回考慮に入れます。ありがとうございます! – brunobliss

答えて

2

おそらく無効な識別子エラーが発生しています。クエリーが解析され実行される順序のため、定義されているクエリーの同じレベルのカラムエイリアス(を除く)を参照することはできません。

あなたはCTEまたはインライン・ビュー(サブクエリ)を使用することができます

SELECT name 
FROM (
    SELECT CONCAT(CONCAT(name1,name2),name3) as name 
    FROM table1 
) 
WHERE name LIKE '%{$qs}%' 

いくつかのダミーデータで:

create table table1 (name1 varchar2(10), name2 varchar2(10), name3 varchar2(10)); 
insert into table1 (name1, name2, name3) values ('john', 'mega', 'rambo'); 
insert into table1 (name1, name2, name3) values ('john', 'master', 'travolta'); 
insert into table1 (name1, name2, name3) values ('john', 'super', 'connor'); 

そのクエリを - ramboに置き換え{$qs}で - 取得:

NAME       
------------------------------ 
johnmegarambo 

ご覧のとおり、concatは自動化されませんあなたは連結演算子を簡単に見つけるかもしれないのでICALLY、空白を追加します。

SELECT name 
FROM (
    SELECT name1 ||' '|| name2 ||' '|| name3 as name 
    FROM table1 
) 
WHERE name LIKE '%{$qs}%' 

NAME        
-------------------------------- 
john mega rambo 

しかし、あなたはあなたの代わりに各列をチェックしたい場合がありますより多くの完全一致を探しているなら:

SELECT name1 ||' '|| name2 ||' '|| name3 as name 
FROM table1 
WHERE name1 = '{$qs}' 
OR name2 = '{$qs}' 
OR name3 = '{$qs}' 

たぶんあなたが欲しいです部分的な一致を検索する柔軟性。

デフォルトでは、検索文字列の大文字と完全に一致する値のみを検索できるため、データではRAMBOを検索すると一致するものは見つかりません。それがあなたのために問題なら、その周りにはいくつかの方法があります。

1

返信いただきありがとうございました。私は正しい方向に私を指摘しました。 Oracleではシンタックスが嫌なので、MySQLで動作するシンプルなHAVINGはOracle上では動作しません。それは "動作しない" より具体的には、常に便利です

WITH table1 as (SELECT CONCAT(CONCAT(name1,name2),name3) as name 
FROM table1) 
      select * from table1 where name like '%{$qs}%' 
+0

CTEが動作する場合、私が示したインラインビュー/サブクエリも同じです。一度参照するだけで本質的に同じです。なぜそれがあなたのために働かなかったのか言う私の答えにコメントすること自由に感じなさい。しかし、...あなたの質問は、MySQLや 'have'は言及していない? –

+0

私はチャンスを得ると、後でエラーメッセージを投稿します。なぜなら、私が通常使用しているのはmysqlだって言いました。 – brunobliss

関連する問題