Оператор SELECT с подстрокой в ​​предложении WHERE - PullRequest
8 голосов
/ 09 марта 2012

У меня есть пример таблицы с тремя полями.

TableA

    FieldA        FieldB        FieldC
    ======================================
    123XYZ456     XYZ           John
    124NNN333     NNN           Jenny
    232XPT124     XPT           Jade
    456XXX345     XXX           James

FieldA имеет фиксированную длину 9. Я не создавал эту таблицу, и некоторые приложения уже используют ее.

Я хочу выбрать FieldB и FieldC с условиями против FieldA.

Используя этот оператор SQL:

SELECT FieldB, 
       FieldC
FROM   TableA
WHERE  FieldA LIKE Concat(@paramA, '%', @paramB) 

Я не могу достичь желаемого результата.Когда я пытаюсь выполнить поиск с параметром paramA 12 и значением paramB '', я получаю результаты 2:

    FieldA        FieldB        FieldC
    ======================================
    123XXX456     XXX           John
    124XXX333     XXX           Jenny

, поскольку, очевидно, он совпадает с 12%, а это не то, чтоЯ хочу.Я хочу, чтобы параметры соответствовали правильному индексу строки.

Если я ищу paramA = '12' и paramB = '', то это не должно иметь никакого результата.Чтобы получить поля (FieldB, FieldC), мне нужны правильные значения paramA = '123' и paramB = '456', поэтому он вернет XYZ и John.Если я хочу вернуть James, тогда я должен дать paramA = '456' и paramB = '345'

Как я могу правильно построить оператор SQL для этого?Любая идея?Спасибо.

Ответы [ 4 ]

16 голосов
/ 09 марта 2012

Использование LEFT() и RIGHT():

SELECT FieldB, FieldC
FROM   TableA
WHERE  LEFT(FieldA,3) = @paramA 
       AND RIGHT(FieldA,3) = @paramB;
4 голосов
/ 09 марта 2012
SELECT Field2,Field3
FROM TABLE
WHERE SUBSTR(Field1,1,3)='123' AND SUBSTR(Field1,7,3)='456'
1 голос
/ 09 марта 2012

Вы не дали понять, почему вы даже позволяете paramB быть пустым при проверке входных данных, но чтобы получить точное поведение, которое вы описали, вы можете просто проверить это, например:

WHERE  @paramA!='' AND @paramB!='' AND FieldA LIKE Concat(@paramA, '%', @paramB) 
0 голосов
/ 07 июня 2013

Примерно так: например, классификационная таблица: дома в Америке, земли в Америке и т. Д.

mysql_query("select classification from properties where LEFT(classification, 5) = 'Homes'");

Результат: Дома

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...