Видаліть два останні символи стовпця в MySQL


80

У мене є стовпець SQL, де записи є рядками. Мені потрібно відобразити ці записи після обрізки останніх двох символів, наприклад, якщо запис є, 199902345він повинен вивести 1999023.

Я спробував розглянути TRIM, але схоже, що він пропонує обрізати, лише якщо ми знаємо, які два останні символи. Але в моєму випадку я не знаю, які ці два останні числа, і їх просто потрібно відкинути.

Отже, коротко, яка операція рядка MySQL дозволяє обрізати останні два символи рядка?

Потрібно додати, що довжина рядка не є фіксованою. Це може бути 9 символів, 11 символів або що завгодно.


Який тип даних стовпця? INT або VARCHAR. INT дозволить швидше обчислювати.
Салман

@Salman його VARCHAR (оскільки ми також використовуємо символи у нашому виконанні)
Lucky Murari

1
Добре тоді SUBSTRINGздається доречним. Для типу даних INT це було так само просто, як поділити на 100.
Сальман

Відповіді:


120

Щоб виділити з рядка всі символи, крім останнього n (або по-іншому, видалити останні останні n символів із рядка); використовуйте функції SUBSTRINGі CHAR_LENGTHразом:

SELECT col
     , /* ANSI Syntax  */ SUBSTRING(col FROM 1 FOR CHAR_LENGTH(col) - 2) AS col_trimmed
     , /* MySQL Syntax */ SUBSTRING(col,     1,    CHAR_LENGTH(col) - 2) AS col_trimmed
FROM tbl

Щоб видалити певний підрядок з кінця рядка, використовуйте TRIMфункцію:

SELECT col
     , TRIM(TRAILING '.php' FROM col)
-- index.php becomes index
-- index.txt remains index.txt

1
Це рішення дуже приємне. Але для цього потрібен прямий доступ до колонки. Якщо стовпець є результатом деяких інших маніпуляцій String, замість цього можна використовувати: REVERSE (SUBSTR (REVERSE ("some_string"), 2))
Charliexyx

74

Чому б не використовувати функцію LEFT (рядок, довжина) замість підрядка.

LEFT(col,length(col)-2) 

Ви можете відвідати тут https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_left, щоб дізнатись більше про рядкові функції Mysql.


1
Хоча прийнята відповідь є правильною, я віддаю перевагу цій відповіді. Я прочитав дискусію про те, що LEFT () є трохи ефективнішим, ніж SUBSTRING (), але зараз я не можу знайти посилання. Було б чудово, якби ви могли додати посилання на документацію mysql для функції LEFT.
anuragw

1
Набагато краще рішення, ніж СУБСТРИНГ ()
Маттіас Кляйн

Якщо різниця полягає , 1у виклику функції, я думаю, що для того, щоб зробити цілком нову функцію, це просто забруднення простору імен. RIGHTтрохи корисніший тим, що може позбавити вас від LENGTH()розрахунку, але все-таки будь-який приріст продуктивності між цими двома, ймовірно, набагато менший, ніж вартість дзвінка LENGTH()окремо. Одна або дві операції додавання на виклик - це єдина різниця між LEFT RIGHTі SUBSTRING. У продуктивності SQL 2 рідні додавання - нічого.
ебіроб

Мені довелося використовувати CHAR_LENGTH замість LENGTH, але це рішення працювало добре.
Ентоні Тейлор


0

Ви можете використати LENGTH(that_string)мінус, який number of charactersви хочете прибрати у SUBSTRING()виділеному, можливо, або використати TRIM()функцію.


1
Якщо ви можете показати приклад TRIM()роботи для всіх символів за індексом, замість того, щоб видалити всі певні типи символів, мені було б цікаво це побачити.
ебіроб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.