наиболее близкое частичное совпадение строк в SQL
У меня есть таблица базы данных, которая содержит, среди прочего, частичные почтовые индексы. Я пытаюсь написать запрос, который возьмет почтовый индекс и найдет строку в таблице, которая соответствует этому коду как можно ближе. В приведенном ниже примере Золотой клиент с почтовым индексом "A1A B2E" будет соответствовать первой строке, а бронзовый клиент с тем же почтовым индексом будет соответствовать третьей строке
CUST_TYPE | POST_CODE | SHIPPING_SURCHARGE
------------------------------------------
Gold | A1A | 0.99
Gold | A2A | 1.01
Gold | A | 3.00
Bronze | A | 1.05
Silver | A | 1.02
Bronze | B | 1.07
Во всех случаях запрос будет запрашиваться как по столбцам CUST_TYPE, так и POST_CODE. Я бы хотел ... запрос, возвращающий только одну строку, содержащую одну строку, которая наилучшим образом соответствует почтовому коду. Таким образом, если я запрошу Gold и 'A1AB2B', я хотел бы, чтобы первая строка (Gold, A1A, 0.99) возвращалась не как первая, так и третья строки
2 ответов:
SQL-Server
SELECT TOP (1) * FROM yourTable WHERE CUST_TYPE = @cust_type AND POST_CODE = LEFT( @postal_code, LEN(POST_CODE) ) ORDER BY LEN(POST_CODE) DESC
Оракул
(я не могу проверить сейчас:)
SELECT * FROM ( SELECT * FROM yourTable WHERE CUST_TYPE = @cust_type AND POST_CODE = SUBSTR( @postal_code, 1, LENGTH(POST_CODE) ) ORDER BY LENGTH(POST_CODE) DESC ) WHERE rownum = 1
Вам нужно просто написать условие следующим образом:
SELECT * FROM YOUR_TABLE WHERE CUST_TYPE = Variable_with_cust_type AND Variable_with_postal_code like '%'||POST_CODE||'%'Вы просто объединяете " % " в начале и в конце поля POST_CODE, а затем используете оператор like.
Я предполагаю, что вы используете ORACLE PL / SQL.
Comments