Sql, Compged, Min и заготовки
Я сравниваю 4 строки, используя compged в sql вот выдержка:
MIN(compged(a.string1,b.string1),
compged(a.string1,b.string2),
compged(a.string2,b.string1),
compged(a.string2,b.string2)) < 200
К сожалению, бывают случаи, когда строка из набора a и строка из набора b пуста / пуста, это означает, что compged разрешает до 0, а найденное минимальное значение равно 0. Есть ли способ изменить так, чтобы сравнение двух пустых строк давало большее значение чем 200 или что-то?
заранее спасибо
2 ответа
Вы можете вычислить новые переменные, чтобы справиться с этой ситуацией (обе сравниваемые переменные являются пустыми) и использовать их внутри MIN()
функция:
case
when (missing(a.string1) and missing(b.string1)) then 300
else compged(a.string1,b.string1)
end as compged_11,
/* do the same for combinations 12, 21 and 22 */
MIN(calculated compged_11,
calculated compged_12,
calculated compged_21,
calculated compged_22) < 200
Быстрый и грязный вариант заключается в том, чтобы обернуть каждую строку другой строкой в 200 символов в случае, если строка равна нулю или ее длина равна 0 (поскольку на пустые строки не всегда ссылаются как на NULL) Так что a.string1 = 200*'Z', b.string1 = 200*'X'.....
Или, что еще лучше, чтобы обернуть каждый вызов проверками, чтобы, если a.string1 был нулевым или пустым, возвращал длину другой строки. И если оба они пусты, то возвращают 1000, поэтому запись удаляется предложением where.
Вы также можете добавить префикс - 'A' для всех строк. Это обеспечит отсутствие пустых строк и не изменит расстояние. Но вам все равно нужно отсеять случаи, когда обе строки пусты.