5

検索条件にユーザー入力に基づいてテーブルを含める/除外するSQL Serverでクエリを作成する必要がありました。

2 つのテーブルがTABLE_AありTABLE_B、 columnKEYCOLUMN_ACOLUMN_Ain TABLE_A、 columnsFKCOLUMN_BCOLUMN_BinがあるとしますTABLE_B

そして、次のようなクエリ:

SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%'

ユーザーが入力しない場合はSEARCH2、検索する必要はありませんTABLE_BIF ELSEしかし、これは条項を意味します。また、クエリ内の「オプションの」テーブルの数が増えると、順列と組み合わせも増え、IFandELSEステートメントが多くなります。

代わりに、ステートメントをそのままにしておくことにしました。SEARCH2が空の場合、クエリは事実上次のようになります。

SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '% %'

SQL オプティマイザLIKE %%は、条件自体を削除するのと同じくらい良いことを認識できますか?

4

7 に答える 7

10

次のように、「B」テーブルをラップORします。

AND (len(searchString)=0 OR table_b.column_b LIKE "%searchString%" )

このように、文字列に値がない場合、その長さはゼロになり、最初の部分ORが評価され、常に真として返され、式のその部分が有効であるとして返され、LIKE句を使用して残りの半分が無視されます。

必要な数のリンクされたテーブルに同じことを適用できます。

于 2009-09-25T11:24:45.053 に答える
2

まず、例にスペースがあります。

AND TABLE_B.COLUMN_B LIKE '% %'

それは確かに重要な条件であるため、最適化されることはありません。

今、それが最適化されているかどうかは、データベース エンジンとそれがどれだけスマートかによると思います。

たとえば、SQL Server 2005は 2 種類のクエリに対して同じ実行プランを提供しますが、MySQL 5.0.38 は提供しません。

于 2009-09-25T11:31:05.553 に答える
2

LIKE を WHERE 句と共に使用して、ワイルド カードを使用してレコードを検索、更新、および削除します。

例:

従業員名に文字「a」が付いているすべてのレコードを検索するには:

select * from Employee where Name like 'a%'

名前がamitで、従業員名が文字「a」で始まるすべてのレコードを更新するには:

update Employee set Name='amit' where Name like 'a%'

従業員名が文字「a」で始まるすべてのレコードを削除するには:

delete from Employee  where Name like 'a%'
于 2012-11-17T09:25:16.480 に答える
0

クエリは次のように書き直すことができます。

SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND (@paramA='' or TABLE_A.COLUMN_A LIKE '%' + @paramA + '%')
AND (@paramB='' or TABLE_B.COLUMN_B LIKE '%' + @paramB + '%')

このように、paramAまたはparamBが''の場合、同じ括弧内で照会される他の列は照会されません。

于 2009-09-25T12:00:31.847 に答える
0

MySQLではILIKE も使用でき、大文字と小文字は区別されません。

于 2009-09-25T11:27:26.233 に答える
0

UNION と適切な JOIN を使用します。

%foo% 検索語は、OR と LEN を追加しないと十分に悪い (インデックスを使用できない) ものです。

SELECT
    TABLE_A.*
FROM
    TABLE_A
    JOIN
    TABLE_B On TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
WHERE
    TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%'
UNION
SELECT
    TABLE_A.*
FROM
    TABLE_A
WHERE
    TABLE_A.COLUMN_A LIKE '%SEARCH%'
于 2009-09-25T15:28:00.210 に答える
0

LIKE 演算子を WHERE 句で使用して、列内の指定されたパターンを検索します。

LIKE '%[p-s]'  -- "It search data from table parameter where sentence ending with p,q,r,s word."
LIKE '[0-9]' --It use for search only numeric value
LIKE '%table%' -- it use for search parameter from table where use "table" keyword'.
LIKE %[^p-r]  -- it set the condition where Not Ending With a Range of Characters

Example: 
SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
        LEFT JOIN TABLE2 T2 on T1.ID  = T2.BrandID
        WHERE T1.BrandName LIKE '%Samsung%'
Example: 
SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
        LEFT JOIN TABLE2 T2 on T1.ID  = T2.BrandID
        WHERE T1.BrandName LIKE '%[a-j]'
于 2015-02-18T03:43:56.780 に答える