Восклицательные знаки в SQL запроса. В sql знак


SQL - Подстановочные знаки

Символ подстановки используется для замены любого другого символа в строке. Подстановочные символы используются с оператором SQL LIKE . Оператор LIKE используется в предложении WHERE для поиска заданного шаблона в столбце. В сочетании с оператором LIKE используются две подстановочные знаки:

  • % - Знак процента представляет нулевой, один или несколько символов
  • _ - Подчеркнутый символ представляет собой один символ

Примеры, с разными LIKE-операторами с «%» и «_» подстановочными знаками:

Выражение Описание
WHERE name LIKE 'text%' Находит любые значения, начинающиеся с "text"
WHERE name LIKE '%text' Находит любые значения, заканчивающиеся на "text"
WHERE name LIKE '%text%' Находит любые значения, которые имеют «text» в любой позиции
WHERE name LIKE '_text%' Находит любые значения, которые имеют «text» во второй позиции
WHERE name LIKE 'text_%_%' Находит любые значения, начинающиеся с «text» и длиной не менее 3 символов
WHERE name LIKE 'text%data' Находит любые значения, начинающиеся с «text» и заканчивающиеся на «data»

Использование символа %

Следующий оператор SQL выбирает всех пользователей с name, начинающимся с «Т»:

Пример:

SELECT * FROM users WHERE name LIKE 'Т%';

Следующий оператор SQL выбирает всех пользователей с именем, содержащим шаблон «То»: 

Пример:

SELECT * FROM users WHERE name LIKE '%То%';

Использование подстановочного знака

Следующий оператор SQL выбирает всех пользователей с name, начиная с любого символа, за которым следует «о»:

Пример:

SELECT * FROM users WHERE name LIKE '_о';

Следующий оператор SQL выбирает всех пользователе с name начиная с «Т», за которым следует любой символ, за которым следует «м», за которым следует любой символ, а затем «с»:

Пример:

SELECT * FROM users WHERE name LIKE 'Т_м_с';

Использование подстановочного знака [charlist]

Следующий оператор SQL выбирает всех пользователей с name, начиная с «Т», «Р» или «Е»:

Пример:

SELECT * FROM users WHERE name LIKE '[ТРЕ]%';

Следующий оператор SQL выбирает всех пользователей с name, начиная с «Т», «Р» или «Е»:

Пример:

SELECT * FROM users WHERE name LIKE '[Т-E]%';

Использование подстановочного знака [! Charlist]

Два следующих оператора SQL выбирают всех пользователей с помощью name NOT, начинающегося с «Т», «Р» или «E»:

Пример:

SELECT * FROM users WHERE name LIKE '[!ТРЕ]%';

Или:

Пример:

SELECT * FROM users WHERE name NOT LIKE '[ТРЕ]%';

 

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

unetway.com

Восклицательные знаки в SQL запроса Безопасный SQL

Как правило, вы видите это в коде MS Access (для восклицательного знака, периода для SQL-сервера). Вы можете ссылаться на столбец по столбцу table.column или если вы даете таблице псевдоним, а затем по alias.column. Вы можете сделать это, если хотите быть конкретными при использовании объединений, или вам может понадобиться сделать это, когда две (или более) таблицы в запросе / объединении имеют одинаковое имя столбца в каждой таблице.

Ну, вы узнаете что-то новое каждый день!

Я изначально планировал объяснить, что если бы вы сказали, что ссылка была [Forms]! [FETT List]! [FETT Search], тогда было бы легко объяснить, как ссылку на элемент [FETT Search] на [ FETT List]. Но без родительской коллекции (либо отчетов форм) она не похожа на действительную ссылку в любом контексте в выражении SQL.

Но потом я решил проверить его и обнаружил (к моему удивлению), что этот оператор SQL считается действительным в форме Access:

SELECT [tblCustomer]![LastName] AS LastName FROM tblCustomer;

В Access это эквивалентно 100% этой инструкции SQL:

SELECT tblCustomer.LastName FROM tblCustomer;

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

Теперь, длинный ответ на общий вопрос! (бит) против. (Точка):

В общем случае в Access оператор bang определяет коллекцию объектов по умолчанию и ее элементы. Оператор dot определяет объект и его методы, свойства и элементы.

Это относится к Access и применяется к объектам Access и объектной модели для Access.

Но вы также используете SQL в Access, и поэтому у вас также есть TableName.FieldName в SQL, где оператор-точка разделяет элемент в коллекции по умолчанию. TableName.FieldName может считаться коротким для TableName.Fields («FieldName»), как вы находите в Forms! MyForm! MyControl эквивалентно Forms! MyForm.Controls («MyControl»). Но это правило не применяется в SQL – TableName.Fields ("FieldName") недействительно SQL, только TableName.FieldName.

Таким образом, вы должны держать прямо, какая парадигма контролирует пространство имен, в котором вы работаете, т. Е. Является ли это пространством имен Access или пространством имен SQL.

Forms! MyForm также эквивалентен Forms.Item («MyForm»), поэтому ультра-длинной формой будет Forms.Items («MyForm»). Элементы управления («MyControl»). Обратите внимание, как оператор bang является ярлыком для более длинной версии с оператором точки, поэтому оператор bang довольно часто используется в предпочтении оператору точки. Также обратите внимание, что более длинная форма используется, когда вам нужно обратиться к элементу, имя которого хранится в переменной, что невозможно с оператором bang:

Dim strForm As String strForm = "MyForm" ' This is OK Debug.Print Forms(strForm).Controls.Count ' This is not Debug.Print Forms!strForm.Controls.Count

Кроме того, в коде VBA Microsoft разработала все, чтобы обмануть это различие в формах и отчетах, где раньше было Me! MyFavoriteControl был законным в качестве контрольной ссылки, а Me.MyFavoriteControl был бы законным только в качестве ссылки на пользовательский свойство (или переменная уровня модуля, которая будет членом объекта). Вы также можете не просто назвать функцию или подменю «MyFavoriteControl», и ее можно было бы назвать оператором точки.

Но с введением VBA MS представила неявно созданные (и поддерживаемые) скрытые оболочки свойств вокруг всех элементов управления, чтобы вы могли использовать оператор точки. Это имело одно огромное преимущество, и это проверка времени контрольных ссылок на компиляцию. То есть, если вы наберете Me.MyFavoriteControl и нет контроля этим именем и никаким другим членом какого-либо типа с этим именем в пространстве имен формы / отчета, тогда вы получите ошибку времени компиляции (действительно, вы бы сообщил об ошибке, как только вы покинули строку кода, где вы сделали ошибку). Итак, если у вас есть этот код:

Debug.Print Me.Control1

… и вы переименовали Control1 в MyControl, вы получите ошибку при следующем компиляции кода.

Что может быть недостатком проверки времени компиляции? Ну, несколько вещей:

  1. код становится сложнее для программиста понять в поле зрения. Раньше Me! Reference означало элемент в коллекции по умолчанию формы / отчета (который является объединением коллекций Fields and Controls). Но Me.Reference может быть контролем или полем или настраиваемым свойством или публичной переменной уровня модуля или публичной суб-функцией или, или, или … Таким образом, он жертвует мгновенной понятностью кода.

  2. вы зависите от неявного поведения VBA и его компиляции. Хотя обычно это нормально делать (особенно если вы внимательно относитесь к своему коду), компиляция VBA очень сложна и подвержена коррупции . На протяжении многих лет опытные разработчики сообщали, что использование оператора dot делает код более подверженным коррупции, поскольку он добавляет еще один слой скрытого кода, который может выйти из синхронизации с частями приложения, которые вы можете явно изменить.

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

Таким образом, многие опытные разработчики (включая меня) не используют оператор точек для управления формами / отчетами.

Это не такая большая жертва, как некоторые могут подумать, если вы используете стандартный набор соглашений об именах. Например, с привязанными элементами управления по формам, пусть они используют имена по умолчанию (т. Е. Имя поля, к которому привязан элемент управления). Если я не ссылаюсь на элемент управления в коде, я никогда не изменю его имя. Но в первый раз, когда я обращаюсь к нему в коде, я меняю его имя так, чтобы имя элемента управления было отличным от имени поля, к которому оно привязано (это неоднозначность имеет решающее значение в определенных контекстах). Итак, текстовое поле MyField становится txtMyField в то время, когда я решаю ссылаться на него в коде. Единственный раз, когда я когда-либо менял имя поля после написания кода, – это если я почему-то решил, что поле было неправильно. В этом случае достаточно легко найти Find / Replace.

Некоторые утверждают, что они не могут отказаться от Intellisense, но это неправда, что вы полностью отказываетесь от нее, когда используете оператор bang. Да, вы отказываетесь от «действительно умного» Intellisense, то есть версии, которая ограничивает список Intellisense для методов / свойств / членов выбранного объекта, но мне это не нужно – мне нужно Intellisense для сохранения нажатий клавиш , а с помощью Ctrl-SPACEBAR вы получаете полный список Intellisense, который автоматически заполняется, как контекстно-зависимая Intellisense, и может затем закоротить печатание.

Другая область путаницы dot / bang – это набор записей DAO в коде VBA, в котором вы используете оператор точек для SQL, который вы используете, чтобы открыть свой набор записей и оператор bang, чтобы ссылаться на поля в результирующем наборе записей:

Dim rs As DAO.Recordset Set rs = CurrentDB.OpenRecordset("SELECT MyTable.MyField FROM MyTable;") rs.MoveFirst Debug.Print rs!MyField rs.Close Set rs = Nothing

Если вы помните, какое пространство имен вы работаете, это не так запутанно – точка используется в выражении SQL и ударе в коде DAO.

Итак, подведем итог:

  1. в SQL вы используете оператор точек для полей в таблицах.

  2. в формах и отчетах вы используете оператор bang для элементов управления и оператор точки для свойств / методов (хотя вы также можете использовать оператор точки, но это не обязательно целесообразно).

  3. в коде VBA ссылки на элементы управления формами и отчетами могут использовать либо точку, либо точку, хотя точка может быть подвержена возможному повреждению кода.

  4. в SQL вы можете увидеть используемого оператора bang, но только если есть ссылка на элемент управления в форме или отчете Access, формы «Form! FormName! ControlName» или «Report! ReportName! ControlName».

  5. в коде VBA, работающем с наборами записей DAO, вы можете видеть как оператор точки и столбца, так и первый в определении SQL, который используется для открытия набора записей, а последний ссылается на поля в результирующем наборе записей после его открытия.

Это достаточно сложно для вас?

sql.fliplinux.com

Функция SIGN - знак числа

Функция SIGN определяет знак числа. Если число больше нуля - функция вернет 1, если меньше нуля - вернет -1, а если равно нулю - вернет 0.

См. также функцию ABS, которая находит модуль числа (из отрицательного делает положительное).

Синтаксис

SELECT SIGN(поле) FROM имя_таблицы WHERE условие

Примеры

Все примеры будут по этой таблице weather, если не сказано иное:

id айди date дата temperature температура
1 2010-06-01 25
2 2010-14-01 0
3 2010-12-01 -25

Пример

Давайте определим знак температуры и запишем его в поле sign:

SELECT *, SIGN(temperature) as sign FROM weather

SQL запрос выберет следующие строки:

id айди date дата temperature температура sign знак температуры
1 2010-06-01 25 1
2 2010-14-01 0 0
3 2010-12-01 -25 -1

Меняем таблицу для примеров

Давайте изменим таблицу weather так, чтобы в ней хранился знак температуры, а не ее значение:

id айди date дата sign знак температуры
1 2010-12-01 -1
2 2010-14-01 0
3 2010-06-01 1

Пример

Давайте теперь добавим новую запись в таблицу так, чтобы mySQL сам вычислил знак температуры:

INSERT INTO weather SET date='2010-12-02', sign=SIGN(-30)

SQL запрос выберет следующие строки:

id айди date дата sign знак температуры
1 2010-12-01 -1
2 2010-14-01 0
3 2010-06-01 1
4 2010-12-02 -1

code.mu

sql - Восклицательные знаки в SQL запроса

Ну, вы узнаете что-то новое каждый день!

Я изначально планировал объяснить, что если бы вы сказали, что ссылка была [Forms]! [FETT List]! [FETT Search], тогда было бы легко объяснить, как ссылку на элемент управления [FETT Search] в форме [FETT List]. Но без родительской коллекции (либо отчетов форм) она не похожа на действительную ссылку в любом контексте в инструкции SQL.

Но потом я решил проверить его и обнаружил (к моему удивлению), что этот оператор SQL считается действительным в форме Access:

SELECT [tblCustomer]![LastName] AS LastName FROM tblCustomer;

В Access это эквивалентно 100% эквиваленту этого оператора SQL:

SELECT tblCustomer.LastName FROM tblCustomer;

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

Теперь, длинный ответ на общий вопрос! (бит) против. (Точка):

В общем случае в Access оператор bang определяет коллекцию объектов по умолчанию и ее элементы. Оператор dot определяет объект и его методы, свойства и элементы.

То есть для Access и применяется к объектам Access и объектной модели для Access.

Но вы также используете SQL в Access, поэтому у вас также есть TableName.FieldName в SQL, где оператор точки разделяет элемент в коллекции по умолчанию. TableName.FieldName может считаться коротким для TableName.Fields( "FieldName" ), как вы находите в Forms! MyForm! MyControl эквивалентно Forms! MyForm.Controls( "MyControl" ). Но это правило не применяется в SQL - TableName.Fields( "FieldName" ) недопустимо SQL, только TableName.FieldName is.

Итак, вы должны держать прямо, какая парадигма контролирует пространство имен, в котором вы работаете, т.е. является ли это пространством имен Access или пространством имен SQL.

Forms! MyForm также эквивалентен Forms.Item( "MyForm" ), поэтому сверхдлинная форма будет FormsItems ( "MyForm" ). Элементы управления ( "MyControl" ). Обратите внимание, как оператор bang является ярлыком для более длинной версии с оператором точки, поэтому оператор bang довольно часто используется в предпочтении оператору точки. Также обратите внимание, что более длинная форма используется, когда вам нужно обратиться к элементу, имя которого хранится в переменной, что невозможно с оператором bang:

Dim strForm As String strForm = "MyForm" ' This is OK Debug.Print Forms(strForm).Controls.Count ' This is not Debug.Print Forms!strForm.Controls.Count

Кроме того, в коде VBA Microsoft разработала все, чтобы обмануть это различие в формах и отчетах, где раньше было Me! MyFavoriteControl был законным в качестве контрольной ссылки, а Me.MyFavoriteControl был бы законным только как ссылка к настраиваемому свойству (или переменной уровня модуля, которая будет членом объекта). Вы также можете не просто назвать функцию или подменю "MyFavoriteControl", и ее можно было бы назвать оператором точки.

Но с введением VBA MS представила неявно созданные (и поддерживаемые) скрытые оболочки свойств вокруг всех элементов управления, чтобы вы могли использовать оператор точки. Это имело одно огромное преимущество, и это проверка времени контрольных ссылок на компиляцию. То есть, если вы наберете Me.MyFavoriteControl и нет контроля этим именем и никаким другим членом какого-либо типа с этим именем в пространстве имен формы/отчета, тогда вы получите ошибку времени компиляции (действительно, вы бы сообщил об ошибке, как только вы покинули строку кода, где вы сделали ошибку). Итак, если у вас есть этот код:

Debug.Print Me.Control1

... и вы переименовали Control1 в MyControl, вы получите ошибку при следующем компиляции кода.

Что может быть недостатком проверки времени компиляции? Ну, несколько вещей:

  • код становится сложнее понять в поле зрения программиста. Раньше Me! Reference означало элемент в коллекции по умолчанию формы/отчета (который является объединением коллекций Fields and Controls). Но Me.Reference может быть элементом управления или полем или настраиваемым свойством или публичной переменной уровня модуля или публичной суб-функцией или, или, или... Таким образом, он жертвует мгновенной понятностью кода.

  • вы зависите от неявного поведения VBA и его компиляции. В то время как это обычно хорошо делать (особенно, если вы хорошо заботитесь о своем коде), Компиляция VBA очень сложна и подвержена коррупции. На протяжении многих лет опытные разработчики сообщали, что использование оператора dot делает код более подверженным коррупции, поскольку он добавляет еще один слой скрытого кода, который может выйти из синхронизации с частями приложения, которые вы можете явно изменить.

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

Таким образом, многие опытные разработчики (включая меня) не используют оператор точек для элементов управления в формах/отчетах.

Это не такая большая жертва, как некоторые могут подумать, если вы используете стандартный набор соглашений об именах. Например, с связанными элементами управления в формах, пусть они используют имена по умолчанию (т.е. Имя поля, к которому привязан элемент управления). Если я не ссылаюсь на элемент управления в коде, я никогда не изменю его имя. Но в первый раз, когда я обращаюсь к нему в коде, я меняю его имя так, чтобы имя элемента управления было отличным от имени поля, к которому оно привязано (это неоднозначность имеет решающее значение в определенных контекстах). Итак, текстовое поле MyField становится txtMyField в то время, когда я решаю ссылаться на него в коде. Единственный раз, когда я когда-либо менял имя поля после написания кода, - это если я почему-то решил, что поле было неправильно. В этом случае достаточно легко найти Find/Replace.

Некоторые утверждают, что они не могут отказаться от Intellisense, но это не так, что вы полностью откажетесь от него, когда используете оператор bang. Да, вы отказываетесь от "действительно умного" Intellisense, то есть версии, которая ограничивает список Intellisense для методов/свойств/членов выбранного объекта, но мне это не нужно - мне нужно Intellisense для сохранения нажатий клавиш, и с помощью Ctrl-SPACEBAR вы получаете полный список Intellisense, который автоматически заполняется так же, как контекстно-зависимая Intellisense, и может затем закоротить печатание.

Другая область путаницы dot/bang - это набор записей DAO в коде VBA, в котором вы используете оператор точек для SQL, который вы используете, чтобы открыть свой набор записей и оператор bang, чтобы ссылаться на поля в результирующем наборе записей:

Dim rs As DAO.Recordset Set rs = CurrentDB.OpenRecordset("SELECT MyTable.MyField FROM MyTable;") rs.MoveFirst Debug.Print rs!MyField rs.Close Set rs = Nothing

Если вы помните, какое пространство имен вы работаете, это не так запутанно - точка используется в выражении SQL и в блоке DAO.

Итак, суммируем:

  • в SQL, вы используете оператор точек для полей в таблицах.

  • в формах и отчетах вы используете оператор bang для элементов управления и оператор точки для свойств/методов (хотя вы также можете использовать оператор точки, но это не обязательно целесообразно).

  • в коде VBA, ссылки на элементы управления формами и отчетами могут использовать либо точку, либо точку, хотя точка может быть подвержена возможному повреждению кода.

  • в SQL, вы можете увидеть используемый оператор bang, но только если есть ссылка на элемент управления в форме или отчете Access, формы "Form! FormName! ControlName" или "Report! ReportName! ControlName".

  • в коде VBA, работающем с наборами записей DAO, вы можете видеть как оператор точки и столбца, так и первый в определении SQL, который используется для открытия набора записей, а последний ссылается на поля в полученном наборе записей один раз он открыт.

Это достаточно сложно для вас?

qaru.site

Как рассчитать проценты с десятичными знаками в SQL? Безопасный SQL

Как я могу преобразовать это в десятичный знак в SQL? Ниже приведено уравнение, и я получаю ответ как 78 (целое число), но реальный ответ равен 78.6 (с десятичной точкой), поэтому мне нужно показать это, так как в противном случае отчет не будет составлять до 100%

convert(decimal(5,2),(100 * convert(float,[TotalVisit1])/convert(float,[TotalVisits]))) AS Visit1percent

Уродливо, но это работает.

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

(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent

По крайней мере, в MySQL (если это помогает), если вы хотите использовать числа с плавающей точкой, вам нужно было использовать поле типа float, а не обычные int-поля.

Просто добавьте десятичное число в 100

(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent

это заставляет всю обработку выполняться в поплавках … если вы хотите получить окончательный вывод в виде текста и усекаетесь для отображения только в одном десятичном разряде, используйте функцию Str

Str( 100.0 * [TotalVisit1]/[TotalVisits], 4, 1 ) AS Visit1percent CAST(ROUND([TotalVisit1]*100.0/[TotalVisits],2)as decimal(5,2)) as Percentage

Не уродливые и работайте лучше и быстрее, наслаждайтесь!

Вероятно, это может быть излишним, но вы можете подумать о том, чтобы отличить все значения от поплавков, чтобы обеспечить точность на всех этапах.

(100.0 * ( [TotalVisit1]+0.0 )/([TotalVisits]+0.0) ) as Visit1percent

Обратите внимание: вам действительно нужно ввести код здесь для случая, когда TotalVisits == 0 или вы получите ответ деления на 0.

SELECT(ROUND(CAST(TotalVisit1 AS DECIMAL)/TotalVisits,1)) AS 'Visit1percent'

Это вернет десятичное число, а ROUND округляет его до одной цифры. Так что в вашем случае вы получите 76.6. Если вы не хотите, чтобы любые цифры меняли 1 на 0, и если вы хотите, чтобы две цифры меняли на 2.

Попробуйте с этим, no round и str или Over (). Я нашел это как более простой способ сделать это.

cast((count(TotalVisit1) * 100.0) /TotalVisits as numeric(5,3)) as [Visit1percent]

Вы можете изменить количество десятичных точек, как вы хотите

например числовые (5,2) или числовые (5,4)

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

Вот как это сделать в Oracle SQL с использованием аналитических функций и подзапроса факторинга (WITH) для генерации выборочных данных.

with data as (select 25 num from dual union all select 25 from dual union all select 25 from dual) select num, case when rnk = 1 then 100 - sum(pct) over (order by rnk desc rows between unbounded preceding and 1 preceding) else pct end pct from ( select num, round(100*ratio_to_report(num) over ()) pct, row_number() over (order by num desc) rnk from data ) / NUM PCT ---------------------- ---------------------- 25 33 25 33 25 34

В ms Access Вы можете использовать функцию SQL ROUND (число, число десятичных знаков), она будет округлять число до заданного числа десятичных знаков:

ROUND ((100 * [TotalVisit1] / [TotalVisits]), 1) AS Visit1percent

sql.fliplinux.com