Как сравнить часть строки с помощью функции like SQL - PullRequest
2 голосов
/ 26 мая 2020

Я не уверен, можно ли использовать подобную функцию для сравнения строк или есть другая функция для достижения этого, но это мой случай, у меня есть следующая часть:

R71-14- 40000 -ATN-LH-D-PF, для третьего сегмента (40000), который является длиной; первые 3 цифры - это целая часть, а последние 2 цифры - это десятичные числа.

Я хотел бы получить все части из БД, где длина (третий сегмент) равна или больше этого значения, например, если я используйте приведенную выше часть, я должен получить желтые значения, опуская другие (значения также могут быть R71-14-50000-ATN-LH-D-PF, R71-14-55000-ATN-LH-D-PF, R71 -14-60000-ATN-LH-D-PF, не только начинать с 4 et c).

enter image description here

Я пробовал это PartNum как '% R71-14 -% - ATN-LH-D-PF%' , но я получаю все части независимо от значения третьего сегмента

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Вы можете использовать подстроку, я думаю:

where substring(col, 8, 5) >= substring('R71-14-40000-ATN-LH-D-PF', 8, 5)

Некоторые базы данных используют substr() вместо substring().

1 голос
/ 26 мая 2020

Использование более ограничительного значения LIKE, такого как

PartNum LIKE 'R71-14-4____-ATN-LH-D-PF'

, ответит на конкретный запрос «значения с 3-м сегментом, начинающимся с 4». Это также может быть ..14-4%-ATN.., хотя я выбрал подстановочный знак _ точно-одно совпадение для явности фиксированной длины третьего сегмента (5); это также проще для движка. или 6 ..

PartNum LIKE 'R71-14-[456789]____-ATN-LH-D-PF'

Это работает в SQL Server , хотя могут быть небольшие различия в различных реализациях RDMBS. Этот подход основан на лексике, который отлично работает с односимвольными целочисленными значениями, даже если он не использует / не использует равенство numeri c. SQL Сервер также поддерживает отрицание символов, что может быть полезно - см. Документацию для спецификаций c РСУБД.

Начальные и конечные % не нужны для отображаемых данных. Использование начального % также может быть очень вредным для использования индекса.

Завершающий % имеет больше смысла, если не заботиться об оставшихся сегментах,

PartNum LIKE 'R71-14-[456789]____-%'

И если необходимо только заботится о 3-м сегменте,

PartNum LIKE '___-__-[456789]____-%'
PartNum LIKE '___-__-[456789]%'      -- or even this

Обратите внимание на отличие от исходного запроса (..14-%-ATN..), который соответствует всем значениям, как ожидалось. Это потому, что не добавляет какие-либо ограничения к значению 3-го сегмента.

...