2015-08-27 5 views
2

Таблица: DotsSQL Server 2008 R2: Обновление с условием

CREATE TABLE dots 
(
    cola VARCHAR(50), 
    NAME VARCHAR(10), 
); 

Вставка:

INSERT INTO dots VALUES('59.96.12.563',''); 
INSERT INTO dots VALUES('594.966.127.5683',''); 
INSERT INTO dots VALUES('5998.8896.4412.22563',''); 
INSERT INTO dots VALUES('791',''); 
INSERT INTO dots VALUES('891',''); 
INSERT INTO dots VALUES('691',''); 

Примечание: Теперь я хочу, чтобы обновить NAME столбец в таблице Dots к значению IP для тех записей, которые содержат 3 точки на нем в colu mn Cola. Например, как показано ниже в ожидаемом результате.

Результат:

Cola     NAME 
--------------------------------      
59.96.12.563   IP 
594.966.127.5683  IP 
5998.8896.4412.22563 IP 
791 
891 
691 

ответ

4

Попробуйте ниже фрагмент кода -

UPDATE dots SET Name = 'IP' 
WHERE (LEN(cola) - LEN(REPLACE(cola, '.', '')))/LEN('.') = 3 
+0

Это не безопасный способ подсчета точек в тексте. Это не удастся, если текст заканчивается пробелом и точкой. Разделение на LEN ('.'), Равное 1, также кажется ненужным. –

+0

@ t-clausen.dk - в соответствии с моим разделом потребуется разделение, потому что каждый раз, когда мы обнаруживаем появление '.' мы удалим 1 символ аналогично, когда мы удалим 2 символа, мы нашли '.' дважды. Также я думаю, что 'LEN (REPLACE (cola, '.', '.X') - LEN (cola)) = 3' выдаст ошибку -' Conversion failed при преобразовании значения varchar в тип данных int' – Abhishek

+0

reason он потерпел неудачу, был исправлен неверно. Мое решение будет решать проблему с заменой большего количества писем. Попробуйте подсчитать вхождения пространства с вашим синтаксисом. Деление на ноль. Это то, что я пытаюсь объяснить. Ваш синтаксис не может быть доверен –

1

Попробуйте это:

UPDATE dots 
    SET NAME = 'IP' 
    WHERE cola LIKE '%.%.%.%' 
+2

cola = 1..1..1..1 – lad2025

+1

Нет, он не подтверждает, что 'cola' является допустимым IP-адресом. Обратите внимание, что требование «Я хочу обновить столбец NAME в таблице Dots до значения IP для тех записей, которые ** содержат 3 точки ** на нем в столбце Cola». –

+2

http://sqlfiddle.com/#!6/8ad99/1 ** 3 точки означают ровно 3 точки, не более не менее ** – lad2025

1

Правильный способ проверки будет с помощью LIKE, это точно проверит 3 точки:

WHERE 
    cola like '%.%.%.%' 
    and cola not like '%.%.%.%.%' 

Если вы представляете себе ЗАМЕНУ метода. Это правильный синтаксис:

WHERE 
    LEN(REPLACE(cola, '.', '.X')) - LEN(cola) = 3 

Причина заключается в том, что

LEN(cola) - LEN(REPLACE(cola, '.', '')) = 3 

потерпит неудачу в случае текст заканчивается пространственным периодом.

Пример:

SELECT LEN(REPLACE('. .', '.', '')) 

Возвращает 0, индикация есть 4 точки в тексте.

Это может быть и не проблема, поскольку пространства, вероятно, не существуют в ваших IP-адресах.

+0

1 Большое вам спасибо за подробный ответ. – MAK

Смежные вопросы