7

私は、Oracle Database クエリ開発の初心者です。ZipまたはNameまたはCityでStores を検索するプロジェクトの検索機能を開発しています。この場合、ユーザーは検索語を入力するための「1 つの HTML 入力ボックス」が提供されます。Stores というテーブルのみがあります。

検索結果の表示条件は、

  1. ZIP結果に一致する検索語がGROUPand である必要がある場合SORT BY ZIP DESC
  2. 結果に一致する検索用語NAMEがグループ化され、並べ替えられ、次NAME IN ASCと同じである必要がある場合CITY
  3. 検索用語がZIP, NAMEand CITY(to all) に一致した場合、最初に に一致した結果がZIPに表示されDESC order、次にCITYThe が続きます。NAME

私はこのようないくつかのことを試しました

SELECT s.uuid AS uuid, COUNT(*) over() AS rowcount
FROM Stores s
WHERE s.postalcode LIKE '%87%'
      OR s.city LIKE '%87%'
      OR CONCAT(CONCAT(s.firstname, ' '),s.lastname) LIKE '%87%'            
GROUP BY s.city, s.postalcode, 
      CONCAT(CONCAT(s.firstname, ' '),s.lastname), s.uuid
ORDER BY CASE WHEN s.postalcode LIKE '%87%'
              THEN s.postalcode END DESC,
         CASE WHEN CONCAT(CONCAT(s.firstname, ' '),s.lastname) LIKE '%87%'
              THEN CONCAT(CONCAT(s.firstname, ' '),s.lastname) 
              ELSE s.postalcode END ASC,
         CASE WHEN s.city LIKE '%87%'
              THEN s.city END 

このクエリは結果を期待どおりに表示していません (最初の zip、次の都市のように名前が続くのではなく、順序なしで結果を表示していることを意味します)。

上記の要件を満たすためにクエリを実行するにはどうすればよいですか? そのためにストアド プロシージャを使用する必要がありますか? どんな提案でも大歓迎です。

4

1 に答える 1

2

私の答えはあなたのスキーマに対するものではないかもしれませんが、それが役立つことはわかっています.

address列を持つテーブルがありますaddressid, address1, address2, address3, city, zip, province, countryid, regionid, modified, modifiedby, VERSION, created, createdby

私の要件は、大文字と小文字を区別せずに関連性で検索することです。関連性の最高の優先順位で列に与えられますCITY。するとADDRESS3ADDRESS2そしてADDRESS1です。

:searchKeyユーザーが入力するバインド変数として持っています(OracleデータベースでSQL Developerを使用しています)。私は以下をうまく使用しています:

  SELECT addressid, address1, address2, address3, city, zip
         , province, regionid, countryid
    FROM address
   WHERE UPPER(address1||' '||address2||' '||address3||' '||city)
         LIKE '%' || UPPER(:searchKey) || '%' -- << Makes search case insensitive
ORDER BY CASE
              WHEN UPPER(city) = UPPER(:searchKey)                THEN 10 
              WHEN UPPER(city) LIKE UPPER(:searchKey) || '%'      THEN 9 
              WHEN UPPER(city) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 8
              ELSE 0
          END DESC -- << Highest priority given to cities that match the best
         , CASE WHEN UPPER(address3) LIKE UPPER(:searchKey) ||'%'       THEN 5 
                WHEN UPPER(address3) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 4
                ELSE 0
           END DESC
         , CASE WHEN UPPER(address2) LIKE UPPER(:searchKey) ||'%'       THEN 3
                WHEN UPPER(address2) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 2
                ELSE 0
           END DESC
         , CASE WHEN UPPER(address1) LIKE UPPER(:searchKey) ||'%'       THEN 2 
                WHEN UPPER(address1) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 1
                ELSE 0
           END DESC
;

コンストラクトの値を変更してCASE、優先順位に従って関連性を許可できます。

于 2012-11-27T07:38:44.397 に答える