SQL SELECT WHERE field contains words
Mastering SQL SELECT WHERE: Finding Fields Containing Specific Words

Learn how to effectively query SQL databases to find records where a text field contains one or more specific words or phrases, using various SQL operators and functions.
When working with relational databases, a common requirement is to retrieve data based on partial string matches within a text field. This article explores different SQL techniques to achieve this, focusing on the SELECT WHERE
clause combined with powerful string matching operators like LIKE
, ILIKE
, and full-text search functions. Understanding these methods is crucial for building robust search functionalities and data filtering mechanisms in your applications.
Basic Word Search with LIKE and Wildcards
The LIKE
operator is the most fundamental way to perform pattern matching in SQL. It's used in conjunction with wildcard characters to define the search pattern. The two primary wildcards are:
%
: Represents zero, one, or multiple characters._
: Represents a single character.
To find a field that contains a specific word, you typically use the %word%
pattern. This pattern ensures that the word can appear anywhere within the string.
SELECT column_name
FROM table_name
WHERE text_field LIKE '%search_word%';
Basic SQL query using LIKE to find a word anywhere in a field.
LIKE
operator is case-sensitive in some database systems (e.g., PostgreSQL by default) and case-insensitive in others (e.g., MySQL, SQL Server). Always test its behavior or use case-insensitive alternatives if needed.Case-Insensitive Search with ILIKE or LOWER/UPPER
For many applications, a case-sensitive search is not desirable. Users expect to find 'apple' whether they type 'Apple', 'apple', or 'APPLE'. SQL provides several ways to achieve case-insensitive matching:
ILIKE
(PostgreSQL specific): This operator is a case-insensitive version ofLIKE
and is highly convenient for PostgreSQL users.LOWER()
orUPPER()
functions: You can convert both the column content and the search pattern to a consistent case (either lowercase or uppercase) before applying theLIKE
operator. This method is more portable across different SQL databases.
-- PostgreSQL specific case-insensitive search
SELECT column_name
FROM table_name
WHERE text_field ILIKE '%search_word%';
-- Portable case-insensitive search using LOWER()
SELECT column_name
FROM table_name
WHERE LOWER(text_field) LIKE LOWER('%search_word%');
Case-insensitive search using ILIKE (PostgreSQL) and LOWER() function.
flowchart TD A[Start Query] --> B{Need Case-Insensitive?} B -- Yes --> C{Database is PostgreSQL?} C -- Yes --> D[Use ILIKE] C -- No --> E[Use LOWER() or UPPER() with LIKE] B -- No --> F[Use LIKE] D --> G[Execute Query] E --> G F --> G G --> H[Return Results]
Decision flow for choosing case-sensitive or case-insensitive search methods.
Searching for Multiple Words (AND/OR)
Often, you need to find records that contain multiple words. You can combine LIKE
clauses using AND
or OR
logical operators.
AND
: Finds records where the field contains all specified words.OR
: Finds records where the field contains any of the specified words.
-- Find records containing 'apple' AND 'pie'
SELECT column_name
FROM table_name
WHERE text_field LIKE '%apple%' AND text_field LIKE '%pie%';
-- Find records containing 'apple' OR 'orange'
SELECT column_name
FROM table_name
WHERE text_field LIKE '%apple%' OR text_field LIKE '%orange%';
Combining LIKE clauses with AND/OR for multiple word searches.
LIKE
clauses with leading wildcards (%
) can be inefficient on large datasets, as it often prevents the use of indexes. For complex or frequent full-text searches, consider dedicated full-text search solutions.Advanced Full-Text Search (FTS)
For more sophisticated word-based searches, including linguistic analysis, ranking, and performance optimization on large text bodies, most modern SQL databases offer Full-Text Search (FTS) capabilities. These are typically implemented as specialized data types or functions.
- PostgreSQL: Uses
to_tsvector
andto_tsquery
with the@@
operator. - MySQL: Uses
MATCH AGAINST
withFULLTEXT
indexes. - SQL Server: Uses
CONTAINS
orFREETEXT
with full-text indexes.
FTS is designed to handle natural language queries much more efficiently than LIKE
for complex scenarios.
PostgreSQL FTS
ALTER TABLE products ADD COLUMN textsearchable_index_col tsvector; UPDATE products SET textsearchable_index_col = to_tsvector('english', description || ' ' || name); CREATE INDEX textsearch_idx ON products USING GIN(textsearchable_index_col);
SELECT product_name, description FROM products WHERE textsearchable_index_col @@ to_tsquery('english', 'apple & pie');
MySQL FTS
ALTER TABLE articles ADD FULLTEXT(title, body);
SELECT title, body FROM articles WHERE MATCH(title, body) AGAINST('database search' IN NATURAL LANGUAGE MODE);
SQL Server FTS
CREATE FULLTEXT CATALOG MyFullTextCatalog AS DEFAULT; CREATE FULLTEXT INDEX ON dbo.Products(ProductName, Description) KEY INDEX PK_Products;
SELECT ProductName, Description FROM dbo.Products WHERE CONTAINS(Description, '"fast processor" OR "high performance"');
While setting up FTS requires more initial configuration, the performance and flexibility gains for text-heavy searches are significant. It allows for features like stemming (e.g., searching for 'run' also finds 'running', 'ran'), synonym support, and relevance ranking.