3

データベースで特定の列のキーワードを検索する SQL ステートメントを作成しています。キーワード 1 とキーワード 2 の条件を満たすレコードを返すクエリが必要です。これはうまく機能していましたが、キーワードを複数の列からクエリできるようにする必要がありました。OR 句を追加した後、1 つのキーワードだけでなく両方のキーワードにヒットするレコードの結果を返すクエリを取得できませんでした。

OR 句が AND 句に影響を与えるのはなぜですか?

指定された 3 つの列を検索しながら、ヒットを取得するために両方のキーワードが必要になるようにするには、このステートメントをどのように修正できますか?

ステートメント:

SELECT CASE WHEN t1.longdesc IS NULL THEN t1.desc 
WHEN t1.longdesc IS NOT NULL THEN t1.longdesc END AS 'description', 
t1.upc 
FROM Items t1 
LEFT JOIN Suppliers t2 ON t1.supplier = t2.supplier_no 
LEFT JOIN Sections t3 ON t1.Section = t3.section_no 
LEFT JOIN Groups t4 on t1.group = t4.group 
WHERE desc LIKE '%keyword1%' 
OR Item_code LIKE '%keyword1%' 
OR certify_code LIKE '%keyword1%' 
AND desc LIKE '%keyword2%' 
OR Item_code LIKE '%keyword2%' 
OR certify_code LIKE '%keyword2%'
4

5 に答える 5

1

ロジックを機能させるには、括弧を使用する必要があります。下記参照:

 SELECT
  CASE WHEN t1.longdesc IS NULL THEN t1.[desc]
       WHEN t1.longdesc IS NOT NULL THEN t1.longdesc
  END AS 'description',
  t1.upc
 FROM
  Items t1
  LEFT JOIN Suppliers t2
    ON t1.supplier = t2.supplier_no
  LEFT JOIN Sections t3
    ON t1.Section = t3.section_no
  LEFT JOIN Groups t4
    ON t1.[group] = t4.[group]
 WHERE
  (
    [desc] LIKE '%keyword1%'
    OR Item_code LIKE '%keyword1%'
    OR certify_code LIKE '%keyword1%'
  )
  AND (
        [desc] LIKE '%keyword2%'
        OR Item_code LIKE '%keyword2%'
        OR certify_code LIKE '%keyword2%'
      )
于 2015-06-10T22:50:47.513 に答える
1

ORパフォーマンスの問題としての使用を避け、 を使用することをお勧めしますISNULL()。したがって、これを使用できます。

SELECT 
    ISNULL(t1.longdesc, t1.desc) AS 'description', 
    t1.upc 
FROM 
    Items t1 
LEFT JOIN 
    Suppliers t2 ON t1.supplier = t2.supplier_no 
LEFT JOIN 
    Sections t3 ON t1.Section = t3.section_no 
LEFT JOIN 
    Groups t4 on t1.group = t4.group 
WHERE 
    (desc + ':' + Item_code + ':' + certify_code) LIKE '%keyword1%' 
AND (desc + ':' + Item_code + ':' + certify_code) LIKE '%keyword2%' 
于 2015-06-11T08:47:52.383 に答える