Предложение LIKE не работает на сервере SQL - PullRequest
2 голосов
/ 06 апреля 2011

У меня есть таблица со следующими столбцами в SQL Server 2005:

DocID   NSN  QTY
-----------------
DHA12    32    5
DSRB23   22   45
TF22     70   23

Всякий раз, когда я выполняю следующий запрос, чтобы получить все NSN, которые имеют DocId, который начинается с DSRB или DHA, ондает мне пустой набор:

SELECT  DocId, NSN, Qty, RequestDate, ReceiveDate
  FROM  Orders 
 WHERE (DocID LIKE '%DSRB%') 
   AND (DocID LIKE '%DHA%')  

Я предполагаю проблему с двумя предложениями LIKE, потому что, когда я удаляю последнее предложение LIKE, запрос работает нормально.

Ответы [ 8 ]

7 голосов
/ 06 апреля 2011

Вы получаете пустой результат, потому что в вашей таблице нет строки, в которой DocID похож на и %DSRB% и %DHA% одновременно.Вы не говорите в своем вопросе, но я предполагаю, что вы ожидаете получить две строки с DocIds DHA12 и DSRB23.

. Для этого вам нужно выбрать строки, где DocIDкак или %DSRB% или %DHA%.Попробуйте изменить AND в вашем предложении WHERE на OR:

SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
FROM Orders
WHERE (DocID LIKE '%DSRB%') OR (DocID LIKE '%DHA%')

См. Это введение в логические операторы SQL , если вам нужно больше примеров.

5 голосов
/ 06 апреля 2011

Если вы хотите найти строки, содержащие или XX или YY, вам нужно использовать ИЛИ :

SELECT DocId, NSN, Qty, RequestDate, ReceiveDate 
FROM Orders 
WHERE (DocID LIKE '%DSRB%')
   OR (DocID LIKE '%DHA%')
3 голосов
/ 06 апреля 2011

Разве вы не хотите там OR вместо AND?

1 голос
/ 06 апреля 2011

Вы уверены, что вам нужно И? У вас нет записей, соответствующих этим требованиям. Я думаю, что вы можете захотеть ИЛИ, которое должно вернуть две записи.

1 голос
/ 06 апреля 2011

Сделайте это "ИЛИ" вместо "И". В этот момент вы говорите, что оба условия в «ГДЕ» должны быть верными.

1 голос
/ 06 апреля 2011

В вашей таблице нет строк, которые содержат строку "DSRB" И содержат строку "DHA".

0 голосов
/ 06 апреля 2011

Ваш LIKE - это сканирование таблицы, поэтому альтернатива, которая работает так же плохо (или хуже), будет

SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
FROM Orders
WHERE REPLACE(REPLACE(DocID, 'DSRB', ''), 'DHA', '') != DocID
0 голосов
/ 06 апреля 2011

Это:

SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
FROM Orders
WHERE (DocID LIKE '%DSRB%') AND (DocID LIKE '%DHA%')

будет соответствовать только что-то вроде "DSRB DHA"

Вы имеете в виду:

SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
FROM Orders
WHERE (DocID LIKE '%DSRB%') OR (DocID LIKE '%DHA%')

Или это:

SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
FROM Orders
WHERE (DocID LIKE '%DSRB%')
UNION
SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
FROM Orders
WHERE (DocID LIKE '%DHA%')
...