Функция SQL для замены нескольких символов в строке. Заменить символ в строке sql


sql - MySQL - Заменить символ в столбцах

Будучи новичком-самоучкой, я создал для себя большую проблему. Прежде чем вставлять данные в мою базу данных, я конвертировал апострофы (') в строку, чтобы удвоить кавычки ("") вместо требуемого обратного слэша и апострофа (\), которые на самом деле требуется MySQL.

До того, как мой стол вырастет более чем на 200 000 строк, я подумал, что лучше всего исправить эту проблему сразу. Поэтому я провел некоторое исследование и нашел функцию SQL REPLACE, которая отличная, но теперь я запутался.

В ASP я делал это:

str = Replace(str,"'","""")

Если я посмотрю на свою базу данных в SQL Workbench, преобразованный символ теперь представляет собой одиночную цитату ("), которая немного смутила меня. Я понимаю, почему она изменилась с двойного на одиночный, но я не знаю, я должен теперь меняться.

Чтобы выполнить и исправить мою проблему с помощью SQL REPLACE, я теперь конвертирую одиночные кавычки ( ") в обратную косую черту и апострофы (\) или конвертирую двойные кавычки (" ") в обратную косую черту и апострофы (\')?

Например, это:

SQL = " SELECT REPLACE(myColumn,"""","\'") FROM myTable "

или это:

SQL = " SELECT REPLACE(myColumn,""","\'") FROM myTable "

Надеюсь, я хорошо себя объяснил, любые предложения с благодарностью восприняли как всегда. Любые вопросы о моем вопросе, пожалуйста, прокомментируйте.

Большое спасибо

- ОБНОВЛЕНИЕ -

Я пробовал следующие запросы, но по-прежнему не могу изменить (") в данных:

SELECT REPLACE(caption,'\"','\'') FROM photos WHERE photoID = 3371 SELECT REPLACE(caption,'"','\'') FROM photos WHERE photoID = 3371 SELECT REPLACE(caption,'""','\'') FROM photos WHERE photoID = 3371

Но если я ищу:

SELECT COUNT(*) FROM photos WHERE caption LIKE '%"%'

Я получаю 16 150 строк.

- ОБНОВЛЕНИЕ 2 -

Ну, я создал "обходной путь". Мне удалось преобразовать целый столбец довольно быстро, написав ASP script, используя этот SQL:

SELECT photoID, caption FROM photos WHERE caption LIKE '%""%';

а затем в ASP я сделал:

caption = Replace(caption,"""","\'")

Но мне все же хотелось бы знать, почему я не смог добиться этого с помощью SQL?

qaru.site

REPLACE ФУНКЦИЯ | Oracle PL/SQL •MySQL •SQL Server

Узнайте, как использовать Oracle / PLSQL функцию REPLACE с синтаксисом и примерами.

Описание

Функция Oracle / PLSQL REPLACE заменяет последовательность символов в строке другим набором символов.

Синтаксис

Синтаксис функции Oracle / PLSQL REPLACE:

REPLACE( string1, string_to_replace, [ replacement_string ] )

Параметры или аргументы

string1 строка для замены последовательности символов другим набором символов.string_to_replace строка, которая будет искаться в string1.replacement_string не является обязательным. Все вхождения string_to_replace будут заменены string_to_replace в string1. Если параметр string_to_replace опущен, то функция REPLACE просто удалит все вхождения string_to_replace, и вернет получившуюся строку.

Применение

Функцию REPLACE можно использовать в следующих версиях Oracle / PLSQL:

  • Oracle 12c, Oracle 11g, Oracle 10g, Oracle 9i, Oracle 8i

Пример

Рассмотрим несколько примеров функции REPLACE и изучим, как использовать функцию REPLACE в Oracle / PLSQL.

SQL> SELECT REPLACE('123123abcd', '123') FROM DUAL; REPLACE('123123ABCD','123') --------------------------- abcd SQL> SELECT REPLACE('123abcd123', '123') FROM DUAL; REPLACE('123ABCD123','123') --------------------------- abcd SQL> SELECT REPLACE('222abcd', '2', '3') FROM DUAL; REPLACE('222ABCD','2','3') -------------------------- 333abcd SQL> SELECT REPLACE('0000123', '0') FROM DUAL; REPLACE('0000123','0') ---------------------- 123 SQL> SELECT REPLACE('0000123', '0', ' ') FROM DUAL; REPLACE('0000123','0','') ------------------------- 123

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

SQL> SELECT REPLACE('123123abcd', '123') FROM DUAL;

REPLACE('123123ABCD','123')

---------------------------

abcd

 

SQL> SELECT REPLACE('123abcd123', '123') FROM DUAL;

REPLACE('123ABCD123','123')

---------------------------

abcd

 

SQL> SELECT REPLACE('222abcd', '2', '3') FROM DUAL;

REPLACE('222ABCD','2','3')

--------------------------

333abcd

 

SQL> SELECT REPLACE('0000123', '0') FROM DUAL;

REPLACE('0000123','0')

----------------------

123

 

SQL> SELECT REPLACE('0000123', '0', ' ') FROM DUAL;

REPLACE('0000123','0','')

-------------------------

    123

oracleplsql.ru

sql - Как заменить несколько символов в SQL?

Это основано на аналогичном вопросе Как заменить несколько символов в SQL Access?

Я написал это, так как sql server 2005, похоже, имеет ограничение на функцию replace() на 19 замен внутри внутри предложения where.

У меня есть следующая задача: нужно выполнить совпадение в столбце и улучшить шансы на совпадение, удаляя несколько ненужных символов, используя функцию replace()

DECLARE @es NVarChar(1) SET @es = '' DECLARE @p0 NVarChar(1) SET @p0 = '!' DECLARE @p1 NVarChar(1) SET @p1 = '@' ---etc... SELECT * FROM t1,t2 WHERE REPLACE(REPLACE(t1.stringkey,@p0, @es), @p1, @es) = REPLACE(REPLACE(t2.stringkey,@p0, @es), @p1, @es) ---etc

Если в пункте where where есть > 19 REPLACE(), это не сработает. Таким образом, решение, которое я придумал, заключается в создании в этом примере функции sql, называемой trimChars (извините, что они начинаются с @22

CREATE FUNCTION [trimChars] ( @string varchar(max) ) RETURNS varchar(max) AS BEGIN DECLARE @es NVarChar(1) SET @es = '' DECLARE @p22 NVarChar(1) SET @p22 = '^' DECLARE @p23 NVarChar(1) SET @p23 = '&' DECLARE @p24 NVarChar(1) SET @p24 = '*' DECLARE @p25 NVarChar(1) SET @p25 = '(' DECLARE @p26 NVarChar(1) SET @p26 = '_' DECLARE @p27 NVarChar(1) SET @p27 = ')' DECLARE @p28 NVarChar(1) SET @p28 = '`' DECLARE @p29 NVarChar(1) SET @p29 = '~' DECLARE @p30 NVarChar(1) SET @p30 = '{' DECLARE @p31 NVarChar(1) SET @p31 = '}' DECLARE @p32 NVarChar(1) SET @p32 = ' ' DECLARE @p33 NVarChar(1) SET @p33 = '[' DECLARE @p34 NVarChar(1) SET @p34 = '?' DECLARE @p35 NVarChar(1) SET @p35 = ']' DECLARE @p36 NVarChar(1) SET @p36 = '\' DECLARE @p37 NVarChar(1) SET @p37 = '|' DECLARE @p38 NVarChar(1) SET @p38 = '<' DECLARE @p39 NVarChar(1) SET @p39 = '>' DECLARE @p40 NVarChar(1) SET @p40 = '@' DECLARE @p41 NVarChar(1) SET @p41 = '-' return REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @string, @p22, @es), @p23, @es), @p24, @es), @p25, @es), @p26, @es), @p27, @es), @p28, @es), @p29, @es), @p30, @es), @p31, @es), @p32, @es), @p33, @es), @p34, @es), @p35, @es), @p36, @es), @p37, @es), @p38, @es), @p39, @es), @p40, @es), @p41, @es) END

Затем это можно использовать в дополнение к другим строкам замены

SELECT * FROM t1,t2 WHERE trimChars(REPLACE(REPLACE(t1.stringkey,@p0, @es), @p1, @es) = REPLACE(REPLACE(t2.stringkey,@p0, @es), @p1, @es))

Я создал еще несколько функций, чтобы сделать аналогичную замену так: trimChars (trimMoreChars (

SELECT * FROM t1,t2 WHERE trimChars(trimMoreChars(REPLACE(REPLACE(t1.stringkey,@p0, @es), @p1, @es) = REPLACE(REPLACE(t2.stringkey,@p0, @es), @p1, @es)))

Может ли кто-нибудь дать мне лучшее решение этой проблемы с точки зрения производительности и, возможно, более чистой реализации?

qaru.site

Замена символов в строке средствами SQL

Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2008.01.27;Скачать: [xml.tar.bz2];

Вниз

Замена символов в строке средствами SQL 
MZ   (2007-09-13 15:09) [0]

Подскажите как средствами SQL заменить любые первые 4 символа в строке

Desdechado ©   (2007-09-13 15:34) [1]

"1234" || SUBSTRING

MZ   (2007-09-13 16:24) [2]

> "1234" || SUBSTRING> Я немного н так выразился.... Есть поле Code (Varchar (9)) в котором содержиться некий код, так вот первые четыре символа этого кода необходимо заменить. и сделать это желательно в XП

Anatoly Podgoretsky ©   (2007-09-13 16:32) [3]

> MZ  (13.09.2007 16:24:02)  [2]

А тебе что разве не это привели?Или ты хочешь полность отлаженый и до конца расписаный код?

MZ   (2007-09-13 16:45) [4]

спасибо! просто сразу не разобрался как работает substring :-)

sniknik ©   (2007-09-13 17:50) [5]

> и сделать это желательно в XПблин, что за мода пихать все в XП? без реальной необходимости... даже если как в данном случае все можно сделать одним запросом.

p.s. счас программку разбираю на предмет переделки, бо медленная и глючная очень, так вся сплошь на ХП! ни одного простого, честного запроса...понимаю если бы там делалось что то, а то подавляющее большинство из них имеет вид CREATE PROCEDURE ProcName as SELECT * FROM TableName ... вот именно так (заменены только имена ProcName и TableName)...хотя есть и похлеще "перлы" видаCREATE PROCEDURE ProcName as SELECT * FROM ViewNameвьюшка в которых имеет вид... ну вы догадались... ;о))

Desdechado ©   (2007-09-13 18:00) [6]

sniknik ©   (13.09.07 17:50) [5]Может, автор перлов начитался идеологии "вся бизнес-логика - в ХП", но не понял, что такое бизнес-логика? Или планировал потом усложнять, меняя ХП?

Krantus   (2007-09-14 14:33) [7]

> sniknik ©   (13.09.07 17:50) [5] > > и сделать это желательно в XП> блин, что за мода пихать все в XП? без реальной необходимости.> .. даже если как в данном случае все можно сделать одним > запросом.для справки. как это в данном случае одним запросом?

PEAKTOP ©   (2007-09-14 15:10) [8]

> Может, автор перлов начитался идеологии "вся бизнес-логика  - в ХП",

А что в этом плохого ? Потом дорабатывать симметричную WWW-систему на Apache+PHP просто прелесть: одинаковое поведение объектов БД не зависимо от способа доступа.

Anatoly Podgoretsky ©   (2007-09-14 15:12) [9]

Ну, ну

Desdechado ©   (2007-09-14 15:26) [10]

>  как это в данном случае одним запросом?UPDATE tbl SET fld = "1234" || SUBSTRING(...) WHERE fld = SUBSTRING(...)

PEAKTOP ©   (14.09.07 15:10) [8]В идее плохого нет, реализация ужасная.

Val ©   (2007-09-15 11:44) [11]

>[5] sniknik ©   (13.09.07 17:50)это может быть удобно при раздаче прав.

Petr V. Abramov ©   (2007-09-15 16:04) [12]

во-первых, [11], во-вторых, при изменени структуры базы не отвалится клиент.

sniknik ©   (2007-09-15 21:56) [13]

> В идее плохого нет, реализация ужасная.а любая идея только плохого содержать не может, везде есть плюсы и минусы. плохо только фанатичное следование оным. (что в этом топике и угадывается... минимальное действие, без всяких предпосылок но уже "желательно в XП")

> это может быть удобно при раздаче прав.и часто ты правами рулишь? направо и налево, в прогах "hello base!". ;о)

а как подобное повлияет на удобность обработки данных? например на выборку данных из одной таблицы по зависящим критериям из другой. (джоин с условием по данным обоих) покажи на примере 2-х процедур с приведенной структурой.(кстати, то как подобного рода обработки сделаны в этой "уже моей" (пока еще надеюсь "отмазаться") в основном и влияет на ее "тормознутость", ну плюс еще и отсутствие индексов, кроме ключей (хоть тут нормально), и отсутствие отключения контролов даже в переоткрытии процедуры по таймеру... дальше не смотрел, бросил, надо все с 0 писать, быстрее будет чем переделывать. хотя еще лучше ничего не делать, пусть пользуются тем что есть... может поймут зачем в конторе программистский отдел, и что админ<>программист даже если он на досуге чтото и написал)

> во-первых, [11], во-вторых, при изменени структуры базы не отвалится клиент.привожу процедуру еще раз CREATE PROCEDURE ProcName as SELECT * FROM TableName меняем структуру таблицы, к примеру поле name на firstname (естественно не меняем саму процедуру, о ней речи не было)клиент не отвалится? ну ну.и тот же вопрос. как часто ты меняешь структуру базы? не на этапе разработки, а уже в релизе. и главное так чтобы меняя базу ничего не трогать в клиенте.???я вот честно не помню за собой такого... всегда было наоборот, требования добавить чтото в программу тянуло за собой изменения базы (ну нет соответствующих полей/таблиц...). а так чтобы переделать базу не пойми с чего, и чтобы не изменять клиента. ну не было...ну вот действительно, а с чего? если клиентская прога работает, устраивает и менять в ней ничего не надо. что в этом случае может заставить менять структуру базы?

Petr V. Abramov ©   (2007-09-15 23:06) [14]

> CREATE PROCEDURE ProcName as SELECT * FROM TableName меняем структуру таблицы, к примеру поле name на firstname (естественно не меняем саму процедуру, о ней речи не было)клиент не отвалится? ну ну.

на клиенте TableName используется 100 раз и неизвестно где, в хранимке - один раз и по dependecies можно вычислить или как у вас там в mssql называется

>  так чтобы переделать базу не пойми с чего, и чтобы не изменять клиента. ну не было...табличка на 2 разбилась, потому что все сложней стало

sniknik ©   (2007-09-16 01:21) [15]

Petr V. Abramov ©   (15.09.07 23:06) [14]в умении не понимать очевидного, написанного черным по серому, вам не откажешь...

> на клиенте TableName используется 100 раз и неизвестно где, в хранимке - один раз и по dependecies можно вычислить зачем вычислять? разве программа/база не ваши, и ктото(ее хозяин?) шифрует инфу о именах чтобы их вычислять? разве про то разговор?при чем тут TableName (имя таблицы)? когда в примере на который это было отвечено, были имена полей этой таблицы.приведенный пример показывает, что при четком выполнении условия > при изменени структуры базы не отвалится клиент. ([12])при оставлении процедур в там виде в котором они есть, клиент таки "отвалится"...а ваши "опровержения"(?) [14] вообще ни о чем. типа "в огороде бузина а в Киеве дядько".

> табличка на 2 разбилась, потому что все сложней сталоразработку и релиз не путай... с чего табличке разбиваться на 2 без причины, и не пофигу ли сложней или проще стало при уже работающей (именно с 1 табличкой), сданной в эксплуатацию программе? (а это единственная причина почему клиентская прога уже не меняется)

Petr V. Abramov ©   (2007-09-16 14:21) [16]

> sniknik ©   (16.09.07 01:21) [15] если речь шла о звездочке, тогда отвалится все.если о том, что по-вашему лишне оборачивать таблицу хранимкой - вот есть 100 форм, в которых используется запрос к TAbleName. При изменении структуры я их что, искать буду?

>  с чего табличке разбиваться на 2 без причины, и не пофигу ли сложней или проще стало при уже работающей (именно с 1 табличкой), сданной в эксплуатацию программе? если сдал в эксплуатацию и хрен положил, тогда да. Если приложение на саппорте и развивается вместе с компанией-заказчиком - все может быть

sniknik ©   (2007-09-16 15:17) [17]

> если речь шла о звездочкену о чем же еще? о звездочке, и о вообще нужности процедуры в таком исполнении.

> вот есть 100 форм, в которых используется запрос к TAbleName. При изменении структуры я их что, искать буду?естественно, если не знаеш где находятся то придется искать. и причем практически в любом случае. будет у тебя не 100 форм, а 100 процедур в которых какимто боком участвует эта таблица (а это будет если в них будет хоть какаято логика с использованием этой таблицы), разве не придется искать и править?

> Если приложение на саппорте и развивается вместе с компанией-заказчиком - все может бытьвот о том и речь, и сколько раз тебе приходилось по заданию сапорта/цто/начальства/клиентов/... кого бы то ни было, менять базу не трогая программу работающую с этой базой?мне ни разу, а вот наоборот (менять клиентскую прогу по их требованиях) постоянно, и тут если делать все через процедуры менять придется минимум в 2 местах.

получается добавляешь себе постоянной работы, вот имя призрачного "все может быть" типа вот потом, если вдруг понадобится, изменю в одном месте и все... ага как же, даже в этом случае чтото будет не так (не знаю что), что помешает.

и было бы изза чего, если бы процедура действительно чтото выполняла, была бы не в 1 запрос, а чтото делала (то что проще сделать на сервере чем в клиентской проге).

Petr V. Abramov ©   (2007-09-16 21:54) [18]

>  будет у тебя не 100 форм, а 100 процедур в которых какимто боком участвует эта таблица это по dependencies ищется. Если будет 100 процедур - тоже не сильно помогает. А если знать, что клиент не обращается  напрямую к таблице никогда а только через вполне понятного названия хранимку (или view), то можно быть уверенным, что надо поправить только хранимку и один раз, а не напрягать мосх знанием того, где на нее референсы в клиенте.

> вот о том и речь, и сколько раз тебе приходилось по заданию > сапорта/цто/начальства/клиентов/... кого бы то ни было, менять базу не > трогая программу работающую с этой базой?

дохрена. у меня правда логика вся на сервере была и будет. Сначала идет изменение базы и серверной логики, и только потом клиента. практика показывает, что изменение клиента можно и утопить частенько, потому что требуемые функции база выполняет, т.е. предоставляет нужные отчеты и вводит первичку со скростью, позволяющей не раздувать штат операторов.

sniknik ©   (2007-09-16 22:17) [19]

> на сервере была и будет.т.е. ты человек потерянный для разумных компромисов. и если логика требует всего лиш запроса то ты его безжалостно перенесешь сервер лиш бы она(логика) стала серверная... :)

> и только потом клиента.э нет... при чем здесь клиент? ты же ратуешь за логику где "меняешь в базе не трогая клиента", а описываешь ситуацию получается "моего типа" когда изза изменений клиента меняется база... (потом это делается или сначала какая разница?)

> позволяющей не раздувать штат операторов.а это то тут каким боком?

p.s. я тут вижу начинается плавный переход(/передергивание) от описанных процедур к какимто глобальным действительно чтото выполняющим... надо закругляться, а то объявят еще чего доброго противником процедур вообще...

Petr V. Abramov ©   (2007-09-17 09:31) [20]

>  а описываешь ситуацию получается "моего типа" когда изза изменений клиента меняется база... из-за изменений базы меняется клиент. база первична, клиент вторичен. Добавилось поле - надо его на какую-нить форму все-таки добавить.Переехало поле в другую таблицу - клиенту это не важно.

sniknik ©   (2007-09-17 10:52) [21]

> база первична, клиент вторичен. Добавилось поле - надо его на какую-нить форму все-таки добавить.что за бред? данные живут собственной жизнью? или к тебе приходит начальник и говорит "а добавь ка ты в базу новое поле. просто так, мне вот захотелось. клиентскую прогу не трогай, там все нормально.". или он все таки говорит "нужны новые данные в отчёте, добавь" и тут ты думаешь есть ли они у тебя в базе, и если нет то меняешь базу, а после клиента чтобы юзерам их эти новые поля показывать/редактировать.

> Переехало поле в другую таблицу - клиенту это не важно.часто переезжает? естественно после того как прога сдана, и главное насколько часто этот "переезд" не вызывает изменений клиента. в очередной раз спрашиваю.

и тебе не все ли одно где менять/искать в проге или в процедурах? если оно "переехало" (и процедуры действительно ПРОЦЕДУРЫ, а не то что в примере тут).

и кстати, если ты там действительно часто, по собственной инициативе, переделываешь базу, улучшаешь чтото, меняешь, то извини но эта база/программа все еще в стадии разработки независимо от того что уже сдана...

Petr V. Abramov ©   (2007-09-17 12:51) [22]

> тут ты думаешь есть ли они у тебя в базе, и если нет то меняешь базу, а > после клиента чтобы юзерам их эти новые поля показывать/редактировать.как это противоречит [20]??? какая разница, начальник сказал поле добавить или сказал "хочу чтоб все было клево"

> и тебе не все ли одно где менять/искать в проге или в процедурах?в процедурах проще, они все "рядом" и ищется по dependenies, сории за троектраное повторение

> извини но эта база/программа все еще в стадии разработки независимо от того что уже сдана...ну есть такое, жизнь идет вперед, все время появляется какая-то новая фигня, старая умирает, что-то делается более универсальным, что-то кастомизируется.

sniknik ©   (2007-09-17 14:33) [23]

> как это противоречит [20]??? тем что первичен все таки юзер(/программа), именно по его желаниям вносятся изменения в рабочую(законченную) программу (именно программу, юзер вообще может не знать что есть такое база), юзер (через начальника и т.д.) требует изменений в программе с которой он работает а уже это тянет за собой изменения в базе.

другого, имхо, не бывает... опять таки если рассматривать готовую программу, а не сданный полуфабрикат который "я тут подумал, и решил базе требуется переделка"...но зато есть куча авторитетных утверждений, что дело обстоит наоборот (лоббирование идеи от производителей субд... ;).

> в процедурах проще, они все "рядом" и ищется по dependenies все компоненты тоже рядом, в датамодуле (или в нескольких логически разделённых) ищется в pas, dfm, простым ctrl+f  f3не вижу разницы.

Petr V. Abramov ©   (2007-09-17 14:43) [24]

> sniknik ©   (17.09.07 14:33) [23] > в датамодуле (или в нескольких логически разделённых) ищется в pas, dfm, простым ctrl+f  f3не вижу разницы.это хорошо когда модулей сильно меньше 1000и в любом случае лучше переделывать только хранимки, чем И хранимки, И клиента

> юзер (через начальника и т.д.) требует изменений в программе с которой он работает а уже это тянет за собой изменения в базе.после чего принимается решение добаваить поле :)

> другого, имхо, не бывает... опять таки если рассматривать готовую программубизнес расширился, просто люди вдруг решили заплатить денег за новыйе фичи...

sniknik ©   (2007-09-17 15:56) [25]

> и в любом случае лучше переделывать только хранимки, чем И хранимки, И клиентао чем твержу с самого начала, только про клиента... изменения которого бывают чаще, лучше менять только клиента, чем клиента + хп. а хранимку менять не придётся если вместо подобного рода хранимок ([5]) будет просто запрос. и различного рода интерпретаций/обработок одних и тех же данных тоже бывает больше, чем изменений в базе, что потребует изменений только клиента если не следовать "дубовой" логике "все должно быть в процедурах", вот тогда, чтобы всего лишь представить данные по другому придётся менять и базу, добавлять хп. потому как такого, нового варианта там не предусмотрено.или например для добавленного поля должно быть ограничение выборки (ну нафига все данные?) добавляешь в запросе который в процедуре условие, выводишь это условие в параметр процедуры (а как еще его задавать?)... и тащишься от того, что ничего в клиенте менять не надо. а он рухнул. почему?

> после чего принимается решение добаваить поле :)т.е. признаешь что программа все таки первична. но прямо сказать стесняешься.

> бизнес расширился, просто люди вдруг решили заплатить денег за новыйе фичи...которые никто не увидит если нет "вывода" в клиентскую прогу. (и которые можно попросту не делать раз они невидимы... замечательно! деньги за воздух... из заднего прохода менеджера который это "впарит")

p.s. ты так и не дал ответа о том приходилось ли менять структуру базы без изменений работающей с ней клиента. (было что то типа "дофига", что в итоге оказалось "парными" изменениями вместо с клиентом, но только "потом").

p.p.s. насильно научить нельзя. © китайская мудрость.

Val ©   (2007-09-17 16:25) [26]

Удалено модератором

Bless ©   (2007-09-17 16:39) [27]

> sniknik

а какие преимущества дает вбивание некоего запроса где-то в CommandText на клиенте по сравнению с вынесением оного в хранимку?

sniknik ©   (2007-09-17 18:09) [28]

Bless ©   (17.09.07 16:39) [27]а какие преимущества дают фразы вылетающие из твоего рта, по сравнению спо маркированными блоками заученными твоим собеседником? так чтобы при разговоре обмениваться метками и сразу становиться ясно что имеется ввиду...

вот примерно такое же. sql это язык общения, когда что то говоришь часто, много и это разумно сократить, типа технический термин включающий целую технологию, это процедура. но привет процедурами говорить... это чересчур (это уже типа "преведа" - падонковшина).  имхо конечно.

Petr V. Abramov ©   (2007-09-17 23:27) [29]

по-моему, пора переносить в "прочее" за отсутствием "я правильно проектирую"

Bless ©   (2007-09-18 09:20) [30]

> sniknik ©   (17.09.07 18:09) [28] > > Bless ©   (17.09.07 16:39) [27]> а какие преимущества дают фразы вылетающие из твоего рта,>  по сравнению спо маркированными блоками заученными твоим > собеседником? так чтобы при разговоре обмениваться метками > и сразу становиться ясно что имеется ввиду...> > вот примерно такое же. sql это язык общения, когда что то > говоришь часто, много и это разумно сократить, типа технический > термин включающий целую технологию, это процедура. но привет > процедурами говорить... это чересчур (это уже типа "преведа" > - падонковшина).  > имхо конечно.>

Иными словами, твое возражение сводится к "не нравится"?

Имхо, проведенная тобой аналогия не очень удачна. Вариантов ответа собеседника в человеческом разговоре - необозримое множество, каждый вариант  не промаркируешь. Количество же запросов к базе - величина счетная. Кроме того, с моей точки зрения на твою аналогию, запрос - это вполне себе "типа технический термин" и удобнее "говорить" "дай мне ведомость ГСМ", чем "дай мне select ... from ... inner join ..." :)

Кроме того, на хранимки, как уже сказали, удобнее раздавать права и они уменьшают сетевой трафик. Не скажу, что эти факторы имеют в моем случае большое значение, но как доп. бонус в пользу процедур...Собственно, лично я стараюсь любой мало-мальски сложный запрос обернуть в хранимку именно из-за возможности правки логики без правки клиентской части. А такая потребность возникает не так уж и редко.

Справедливости ради отмечу, что у меня как раз ситуация, описанная твоими же словами "эта база/программа все еще в стадии разработки независимо от того что уже сдана...".

sniknik ©   (2007-09-18 12:05) [31]

> дай мне ведомость ГСМэто уже как раз "термин", пусть он не не очень сложный но он логически выделяем. (это и я бы сделал если не процедурой так вьюшкой... возможно)

> чем "дай мне select ... from ... inner join ..." :)найди inner join в приведённых, обсуждаемых процедурах. ([5])  

> лично я стараюсь любой мало-мальски сложный запрос сложный типа [5]? вот вот...

p.s. не пытайтесь навязать мне роль "противника процедур вообще" pls, моя позиция "процедуры только там где они необходимы", а против я, только того подхода что описал "все без исключения через процедуры". т.к. удобства, имхо, мнимые, а проблем увеличивается.

> Имхо, проведенная тобой аналогия не очень удачна.другая может более удачная.средние и тёмные века... алхимик с именем "Клиент" и лаборант с именем "Сервер sql (можно просто Сервер)", алхимик сам работать не любит, заставляет лаборанта, типа "а сделай ка мне любовное зелье!""Сервер" зная рецепт зелья берет свежую печень лягушки, помет летучей мыши и т.д.(список ингредиентов)  варит, парит перемешивает их и еще как то обрабатывает, в конце отжимает первые 20 капель (первый отжим) в пузырёк (10 оставшихся "зажимает" себе ;), клеит на него лейбел "шанель №5" и подаёт "Клиенту"...во! вот это процедура! (т.е. рецепт в данном случае = процедуре в нашем)рецепт может быть и не таким сложным, но он должен все таки чем то выделяться, иметь логическую завершённость, чтобы иметь право зваться рецептом...если же алхимик просто орёт лаборанту "дай мне жабу вон с того стола, да позеленее!" это просто запрос, и не иначе.а мне говорят, что это тоже надо сделать процедурой (рецептом) и кричать вместо "дай жабу ..." - "подача лягушки №8" типа удобнее, т.к. если вдруг в комнате случится перестановка(с чего бы?) и и на месте стола появится тумбочка, и аквариум с жабами переедет на неё, то не надо будет менять в языковой конструкции стол на тумбочку, а продолжать орать "подача лягушки №8"...я же говорю, что перестановки у меня бывают гораздо реже чем потребность в "лягушках" меняется на потребность в "сушенных кузнечиках" например или др. совершенно неожиданное (т.к. не от меня, и даже не от погоды зависит), и если пытаться все эти потребности заформализовать, и на каждый сделать свой рецепт... то и получится то с чем я сталкиваюсь, не первый раз причём, и с чего начал говорить в ветке - на 20 таблиц 10 вьюшек и 40 процедур (ни одна из которых толком ничего не делает... 30 просто показанные "пустышки", и это в программе которая "рабочая, только чего то, ни с того не сего стала подтормаживать, ну и вылетать время от времени..." ).  

ну вот, до сих пор непонятно? неважно, это мой последний пост в данной ветке. (какой смысл? если слышат не то, что говоришь, а то что хотят услышать)

Bless ©   (2007-09-18 17:25) [32]

> sniknik ©   (18.09.07 12:05) [31]> сложный типа [5]? вот вот...

В первом варианте моего ответа были слова "заворачивать запрос вида [5] в хранимку я тоже считаю глупостью". Теперь жалею, что вырезал :)

> > p.s. не пытайтесь навязать мне роль "противника процедур > вообще" pls, моя позиция "процедуры только там где они необходимы",>  а против я, только того подхода что описал "все без исключения > через процедуры". т.к. удобства, имхо, мнимые, а проблем > увеличивается.>

Собственно, я тебя понял правильно. Просто показалось, что твое "где они необходимы" сильно меньше, чем мое.Ведь камни в огород ХП ты начал бросать не со своего, доставшегося тебе по наследству, примера (где с хранимками очевидный перебор), а в ответ на "как средствами SQL заменить любые первые 4 символа в строке и сделать это желательно в XП".А я как раз могу представить ряд вариантов (ввиду того, что формулировка автора сабжа допускает широкую трактовку того, что именно ему хочется сделать), когда это стоит вынести именно в ХП. Поэтому твоя резко негативная реакция удивила.

Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2008.01.27;Скачать: [xml.tar.bz2];

Наверх

Память: 0.87 MBВремя: 0.05 c

www.delphimaster.net

sql - Заменить каждый альфа-символ на себя + подстановочный знак в строке SQL Server

Фактически, эта строка поиска возвращает только одну запись из этой таблицы: строка с 'cat '.

Это связано с тем, что выражение C%[^a-zA-Z0-9]%A не означает, что между C и A не может быть буквенно-числовых символов. Фактически это означает, что между C и A должно быть по крайней мере одно не альфа-цифровое значение.

Более того, он также вернет неверные значения - будет возвращено значение типа 'cuaset '.

Вам нужно изменить предложение where на что-то вроде этого:

WHERE column LIKE '%C%A%T%' AND column NOT LIKE '%C%[a-zA-Z0-9]%A%[a-zA-Z0-9]%T%'

Таким образом, если у вас есть cat в правильном порядке, первая строка будет разрешать true, а если нет других буквенно-числовых символов между c, a и t вторая строка будет разрешена к true.

Вот тестовый скрипт, где вы можете сами убедиться, что я имею в виду:

DECLARE @T AS TABLE ( a varchar(20) ) INSERT INTO @T VALUES ('cat'), ('c/a/t'), ('c.a.t '), ('c. at'), ('c u a s e t ') -- Incorrect where clause SELECT * FROM @T WHERE a LIKE 'C%[^a-zA-Z0-9]%A%[^a-zA-Z0-9]%T%[^a-zA-Z0-9]%' -- correct where clause SELECT * FROM @T WHERE a LIKE '%C%A%T%' AND a NOT LIKE '%C%[a-zA-Z0-9]%A%[a-zA-Z0-9]%T%'

Вы также можете увидеть его в действии в этой ссылке.

И так как у меня было свободное время, вот сценарий для создания как like и not like шаблонов из входной строки:

DECLARE @INPUT varchar(100) = '@*# c %^&# a ^&*$&* t (*&(%!@#$' DECLARE @Index int = 1, @CurrentChar char(1), @Like varchar(100), @NotLike varchar(100) = '%' WHILE @Index < LEN(@Input) BEGIN SET @CurrentChar = SUBSTRING(@INPUT, @Index, 1) IF PATINDEX('%[^a-zA-Z0-9]%', @CurrentChar) = 0 BEGIN SET @NotLike = @NotLike + @CurrentChar + '%[a-zA-Z0-9]%' END SET @Index = @Index + 1 END SELECT @NotLike = LEFT(@NotLike, LEN(@NotLike) - 12), @Like = REPLACE(@NotLike, '%[a-zA-Z0-9]%', '%') SELECT * FROM @T WHERE a LIKE @Like AND a NOT LIKE @NotLike

qaru.site

string - Функция SQL для замены нескольких символов в строке

Я пишу пользовательскую функцию SQL Server 2008 для замены символов строки другим символом. Я думаю, что код ниже должен работать, но это не так. Кажется, он не обновляет переменную для @input правильно.

Любая идея, как я могу это исправить?

DECLARE @Input AS VarChar(1000) DECLARE @i AS TinyInt DECLARE @Substring AS VarChar(1000) DECLARE @Prestring AS VarChar(1000) DECLARE @Poststring AS VarChar(1000) Select @Input='ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', @i = 1 WHILE @i <= LEN(@Input) BEGIN SELECT @Prestring = SUBSTRING(@Input,-1,@i) SELECT @Poststring = SUBSTRING(@Input,@i+1,LEN(@Input)) SELECT @Substring = replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace (replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace (SUBSTRING(@Input,@i,1), 'A', 'N'),'B', 'O'), 'C', 'P'), 'D', 'Q'), 'E', 'R'), 'F', 'S'), 'G', 'T'), 'H', 'U'), 'I', 'V'), 'J', 'W'), 'K', 'X'), 'L', 'Y'), 'M', 'Z'), 'N', 'A'), '0', 'B'), 'P', 'C') , 'Q', 'D'),'R', 'E'),'S', 'E'),'T', 'E'),'U', 'F'),'V', 'G'),'W', 'H'),'X', 'I'),'Y', 'J'), '1', '9'),'2','8'),'3','7'),'4','6'),'5','5'),'6','4'),'7','3'),'8','2'),'9','1'),' ','') SELECT @Input = @Prestring + @Substring + @Poststring SELECT @i = @i + 1 PRINT 'Prestring= ' + @Prestring PRINT 'SUBSTRING= ' + @Substring PRINT 'PostString= ' + @Poststring PRINT 'Total String: ' + @Prestring + ' + ' + @Substring + ' + ' + @Poststringenter code here PRINT 'END' END Output: Prestring= SUBSTRING= A PostString= BCDEFGHIJKLMNOPQRSTUVWXYZ123456789 Total String: + A + BCDEFGHIJKLMNOPQRSTUVWXYZ123456789 1 END Prestring= A SUBSTRING= O PostString= CDEFGHIJKLMNOPQRSTUVWXYZ123456789 Total String: A + O + CDEFGHIJKLMNOPQRSTUVWXYZ123456789 2 END Prestring= AO SUBSTRING= C PostString= DEFGHIJKLMNOPQRSTUVWXYZ123456789 Total String: AO + C + DEFGHIJKLMNOPQRSTUVWXYZ123456789 3 END Prestring= AOC SUBSTRING= D PostString= EFGHIJKLMNOPQRSTUVWXYZ123456789 Total String: AOC + D + EFGHIJKLMNOPQRSTUVWXYZ123456789 4 END ......

qaru.site

Как заменить символ в строке MySQL

Во многих веб приложениях необходимо хранить разнообразные настройки. Например, настройки почтовых рассылок в социальных сетях или на форуме. С точки зрения хранения данных одним из распространенных способов является сохранение настроек в поле типа SET. Такой способ удобен для хранения двух состояний каждой настройки (включено/выключено). Но в некоторых случаях нужно сохранять несколько значений. Пример из социальных сетей: настройка приватности “Кто может видеть мой email?” – здесь возможны варианты:

  • все (2)
  • только мои друзья (1)
  • никто (0)

В данном случае настройки можно хранить в виде строки чисел, где каждый символ отвечает за определенный пункт настроек. Например строка “019910” – в ней первый символ отвечает за настройку “Кто может видеть мой email?”. В данном примере первый символ равен “0”, т.е. никто не может видеть email пользователя.

Ну вот, хотел написать об MySQL функции, а получилось вступление по другой теме 🙂

Перейдем к примерам работы со строками в MySQL.

MySQL предоставляет целый ряд функций для работы со строками. Для замены символа (или подстроки) используется функция INSERT:

INSERT(str, pos, len, newstr) – возвращает строку str, где подстрока, которая начинается с pos и имеет длину len, заменена строкой newstr

Пример:

SELECT INSERT(‘Zend Framework’, 1, 4, ‘Symfony’)

Такой запрос заменяет подстроку “Zend” на “Symfony” и в результате получается “Symfony Framework”.

Очень важно помнить, что в MySQL индексы строк начинаются с 1, а не с 0!

Таким образом, для замены символа в строке (на примере настроек приватности):

UPDATE users SET privacy = INSERT(privacy, 1, 1, ‘2’)

Данным запросом меням настройку приватности для email. Исходная строка принимает значение “219910” – это значит что email доступен для просмотра всем.

Кажется, пора идти домой уже… 🙂

snowcore.net