Я использовал это в течение некоторого времени:
SUBSTRING(str_col, PATINDEX('%[^0]%', str_col), LEN(str_col))
Однако недавно я обнаружил проблему со столбцами со всеми символами «0», такими как «00000000», потому что он никогда не находит совпадения, отличного от «0».
Альтернативная техника, которую я видел, заключается в использовании TRIM
:
REPLACE(LTRIM(REPLACE(str_col, '0', ' ')), ' ', '0')
Это имеет проблему, если есть встроенные пробелы, потому что они будут превращены в «0», когда пробелы возвращаются в «0».
Я пытаюсь избежать скалярного UDF. Я обнаружил много проблем с производительностью UDF в SQL Server 2005.
sql
sql-server
sql-server-2005
tsql
string
Кейд Ру
источник
источник
Ответы:
источник
Arvo
на ТАК!Почему бы вам просто не привести значение к,
INTEGER
а затем вернуться кVARCHAR
?источник
SELECT CASE ISNUMERIC(str_col) WHEN 1 THEN CAST(CAST(str_col AS BIGINT) AS VARCHAR(255)) ELSE str_col END
BIGINT
некоторыми типами строк все равно не получится преобразование. Рассмотрим0001E123
для примера.Другие ответы здесь, чтобы не принимать во внимание, если у вас есть все нули (или даже один ноль).
Некоторые всегда устанавливают по умолчанию пустую строку в ноль, что неверно, когда предполагается, что она остается пустой.
Перечитайте оригинальный вопрос. Это отвечает на то, что хочет спрашивающий.
Решение № 1:
Решение № 2 (с образцами данных):
Полученные результаты:
Резюме:
Вы можете использовать то, что у меня есть выше, для одноразового удаления начальных нулей.
Если вы планируете многократно использовать его, поместите его в функцию Inline-Table-Valued-Function (ITVF).
Ваши опасения по поводу проблем с производительностью UDF понятны.
Однако эта проблема относится только к функциям All-Scalar-Functions и Multi-Statement-Table-Functions.
Использование ITVF совершенно нормально.
У меня та же проблема с нашей сторонней базой данных.
С помощью буквенно-цифровых полей многие вводятся без пробелов, черт возьми!
Это делает невозможным объединение без очистки отсутствующих ведущих нулей.
Вывод:
Вместо удаления начальных нулей, вы можете захотеть просто дополнить свои обрезанные значения начальными нулями, когда вы делаете свои объединения.
Еще лучше очистить данные в таблице, добавив начальные нули, а затем перестроив индексы.
Я думаю, что это будет гораздо быстрее и менее сложным.
источник
Вместо пробела замените 0 на «редкий» символ пробела, которого обычно не должно быть в тексте столбца. Перевод строки, вероятно, достаточно хорош для такого столбца. Затем вы можете использовать LTrim в обычном режиме и снова заменить специальный символ на 0.
источник
Следующее вернет '0', если строка полностью состоит из нулей:
источник
Это делает хорошую функцию ....
источник
приведение (значение как int) всегда будет работать, если строка является числом
источник
Моя версия этого - адаптация работы Арво, с добавлением немного больше, чтобы обеспечить два других случая.
1) Если у нас есть все 0, мы должны вернуть цифру 0.
2) Если у нас есть пробел, мы все равно должны вернуть пробел.
источник
Предложение Томаса Г. сработало для наших нужд.
Поле в нашем случае уже было строковым, и нужно было обрезать только начальные нули. В основном это все цифры, но иногда встречаются буквы, поэтому предыдущее преобразование INT может привести к сбою.
источник
Это имеет ограничение на длину строки, которая может быть преобразована в INT
источник
Если вы используете Snowflake SQL, можете использовать это:
Функция ltrim удаляет все экземпляры назначенного набора символов с левой стороны.
Таким образом, ltrim (str_col, '0') в '00000008A' вернет '8A'
И rtrim (str_col, '0.') В '$ 125.00' вернет '$ 125'
источник
Хорошо работает даже с «0», «00» и так далее.
источник
Попробуй это:
источник
Если вы не хотите преобразовывать в int, я предпочитаю эту логику ниже, поскольку она может обрабатывать пустые значения IFNULL (field, LTRIM (field, '0'))
источник
В MySQL вы можете сделать это ...
источник