powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Достало начальство
10 сообщений из 10, страница 1 из 1
Достало начальство
    #32006207
Tarantino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну во первых всем Привет!!!
А вот вторых subj, и как говорится из за ошибок америкосов страдуют Русские программисты!
Вообщем в чём суть проблемы есть некая табличка и в ней есть поле referens типа varchar(255), в этом поле содержатся номера сообщений, референсы выглядят следующим образом:
20010331/3456
20010212/TEST
MESS-12345678
на и т.д.
Собственно в этой таблице хранятся референсы сообщений которые мы отправляем америкосом, они нам в ответ присылают сообщение в котором перечислены референсы сообщений которые они получили от нас, НО это злодеи из референсов убирают все не алфавитно-цифровые символя, т.е. если мы им послали сообщение с референсом 20010525/1234 они в ответ присылают что они получили 200105251234, ошибка америкосов, но руководство не хочет с ними бодатся, а заставлет меня написать запрос типа:
SELECT
*
FROM
messages (NOLOCK)
WHERE
reference = '200105251234'
и он должен выдать курсом где поле reference будет равно 20010525/1234, как написать такой запрос?
...
Рейтинг: 0 / 0
Достало начальство
    #32006210
rrr5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT
*
FROM
messages (NOLOCK)
WHERE
REPLACE(reference,'/','') = '200105251234'
...
Рейтинг: 0 / 0
Достало начальство
    #32006211
saint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему ты не хочешь создать второе поле, в которое заранее будешь писать вариант присылаемый янками? На мой взгляд - самое простое и тупое решение
...
Рейтинг: 0 / 0
Достало начальство
    #32006239
Tarantino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
SELECT
*
FROM
messages (NOLOCK)
WHERE
REPLACE(reference,'/','') = '200105251234'

Этот вариант проходит только если надо слэш убирать, а фактически нужно убирать все не алфавитно-цифровые символы, т.е. мы им можем послать сообщении с референсом '20010522/456.45' а они пришлют что получили '2001052245645'.

2. На самом деле доп.поле можно создать, но в этом совершенно нет необходимости, т.к. в первый раз всё равно надо как сопаставить референсы, а в этом вся и проблема!!!
...
Рейтинг: 0 / 0
Достало начальство
    #32006243
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Tarantino

есть такая аксиома в программировании: автоматизация бардака невозможна(бардак - в смысле организации работы, а не заведение).

Так вот это типичный пример. Америкосы могут как-то поменять номер - скажите как мне его всё равно найти? Следующий этап - мне это не нравиться, сделайте что бы было хорошо.
Если невозможно формализовать алгоритм искажения номера(о как умно написал!) - ничего не сделаешь(см. аксиому). Если можно - пиши, будем думать как реализовать, а скорее всего сам сообразишь.

С приветом Сергей
...
Рейтинг: 0 / 0
Достало начальство
    #32006246
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может быть попытаться анализировать коды символов на принадлежность диапазону кодовой страницы, отведённому для цифр?
...
Рейтинг: 0 / 0
Достало начальство
    #32006258
zamm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему нельзя сделать через SP или UDF?
Ведь там то сделать без проблем.
...
Рейтинг: 0 / 0
Достало начальство
    #32006259
Вообще-то идею я взял и SergSuper

DECLARE @tbSimbolTmp TABLE ( Num char(1) )
DECLARE @tbTmp TABLE ( Num int )

DECLARE @AA int
SET @AA = 0
WHILE ( 1+1 =2 ) BEGIN
__INSERT INTO @tbSimbolTmp VALUES ( @AA )
__SET @AA = @AA +1
__IF ( @AA = 10 ) BREAK
END

SET @AA = 65
WHILE ( 1+1 =2 ) BEGIN
__INSERT INTO @tbSimbolTmp VALUES ( CHAR(@AA) )
__SET @AA = @AA +1
__IF ( @AA = 91 ) BREAK
END

SET @AA = 1
WHILE ( 1+1 =2 ) BEGIN
__INSERT INTO @tbTmp VALUES ( @AA )
__SET @AA = @AA +1
__IF ( @AA = 14 ) BREAK
END

DECLARE @S varchar(20)
SET @S = 'MESS-12345678'
SELECT @S

SELECT
__@S = ISNULL( STUFF( @S, T.Num, CASE WHEN EXISTS ( SELECT * FROM @tbSimbolTmp WHERE Num = SUBSTRING( @S, T.Num, 1) ) THEN 0 ELSE 1 END, '' ), @S )
FROM
__@tbTmp as T

Количество строк в таблице @tbTmp должно соответствовать длине поля.
Удачи
...
Рейтинг: 0 / 0
Достало начальство
    #32006262
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели я даю такие идеи? Ужас... Пора прекращать их давать.

Я бы проще написал последнюю строчку

SELECT @S = replace(@S,Num,'')FROM @tbSimbolTmp
...
Рейтинг: 0 / 0
Достало начальство
    #32006263
Идея взята из артикла "Замена символов в строке"

SELECT @S = replace(@S,Num,'') FROM @tbSimbolTmp
это конечно проще, только в таком варианте, надо по другому собирать @tbSimbolTmp
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Достало начальство
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]