SQLite CASE / WHEN - числовой запрос - PullRequest
0 голосов
/ 16 января 2019

У меня есть следующий код, который работает в SQL:

"(CASE WHEN isnumeric(Installation) > 0 THEN cast(Installation as bigint) ELSE null END) "

Я пытаюсь преобразовать его для работы в SQLite, но у меня возникли проблемы, поскольку у меня очень мало опыта работы с SQLite. По сути, я хочу привести / преобразовать мой stringcolumn (Installation) в bigint, но мне нужна проверка, чтобы убедиться, что он содержит только числовые символы.

Я испробовал следующие 3 варианта, но безуспешно. Просто получаю сообщение об ошибке не могу выполнить запрос

("(CASE WHEN Installation GLOB '*[^0-9]*' THEN cast(Installation as bigint) ELSE null END)");

("(SELECT Installation from ShortCycleWorkOrderCompletions WHERE Installation = REGEXP '*[^0-9]*'");

("(CASE WHEN REGEXP(Installation, '*[^0-9]*') THEN cast(Installation as bigint) ELSE null END");

Не нужно, чтобы все 3 работали, только один, и это то, что я пробовал.

NHibernate.Exceptions.GenericADOException: could not load an entity: [MapCall.Common.Model.Entities.ShortCycleWorkOrderCompletion#666][SQL: SELECT shortcycle0_.Id as Id510_0_, shortcycle0_.SAPCommunicationError as SAPCommu2_510_0_, shortcycle0_.SAPErrorCode as SAPError3_510_0_, shortcycle0_.ActiveMQStatus as ActiveMQ4_510_0_, shortcycle0_.WorkOrderNumber as WorkOrde5_510_0_, shortcycle0_.MiscInvoice as MiscInvo6_510_0_, shortcycle0_.BackOfficeReview as BackOffi7_510_0_, shortcycle0_.CompletionStatus as Completi8_510_0_, shortcycle0_.Notes as Notes510_0_, shortcycle0_.AdditionalWorkNeeded as Additio10_510_0_, shortcycle0_.Purpose as Purpose510_0_, shortcycle0_.TechnicalInspectedOn as Technic12_510_0_, shortcycle0_.TechnicalInspectedBy as Technic13_510_0_, shortcycle0_.ServiceFound as Service14_510_0_, shortcycle0_.ServiceLeft as Service15_510_0_, shortcycle0_.OperatedPointOfControl as Operate16_510_0_, shortcycle0_.AdditionalInformation as Additio17_510_0_, shortcycle0_.CurbBoxMeasurementDescription as CurbBox18_510_0_, shortcycle0_.Safety as Safety510_0_, shortcycle0_.HeatType as HeatType510_0_, shortcycle0_.MeterPositionLocation as MeterPo21_510_0_, shortcycle0_.MeterDirectionalLocation as MeterDi22_510_0_, shortcycle0_.MeterSupplementalLocation as MeterSu23_510_0_, shortcycle0_.ReadingDevicePositionalLocation as Reading24_510_0_, shortcycle0_.ReadingDeviceSupplementalLocation as Reading25_510_0_, shortcycle0_.ReadingDeviceDirectionalLocation as Reading26_510_0_, shortcycle0_.FSRId as FSRId510_0_, shortcycle0_.SerialNumber as SerialN28_510_0_, shortcycle0_.ManufacturerSerialNumber as Manufac29_510_0_, shortcycle0_.MeterSerialNumber as MeterSe30_510_0_, shortcycle0_.DeviceCategory as DeviceC31_510_0_, shortcycle0_.ActionFlag as ActionFlag510_0_, shortcycle0_.Installation as Install33_510_0_, shortcycle0_.ActivityReason as Activit34_510_0_, shortcycle0_.OldMeterSerialNumber as OldMete35_510_0_, shortcycle0_.QualityIssue as Quality36_510_0_, shortcycle0_.ReceivedAt as ReceivedAt510_0_, shortcycle0_.ShortCycleWorkOrderId as ShortCy38_510_0_, cast(shortcycle0_.WorkOrderNumber as varchar(12)) as formula90_0_, (CASE WHEN (CHARINDEX('SUCCESS', UPPER(cast(shortcycle0_.SAPErrorCode as varchar(8000)))) > 0) THEN 0 ELSE 1 END)  as formula91_0_, (CASE WHEN (CHARINDEX('SUCCESS', UPPER(cast(shortcycle0_.ActiveMQStatus as varchar(8000)))) > 0) THEN 0 ELSE 1 END) as formula92_0_, (CASE WHEN (NOT TRIM(shortcycle0_.Installation) GLOB '*[^0-9]*') AND TRIM(shortcycle0_.Installation) like '_%' THEN CAST(TRIM(shortcycle0_.Installation) AS shortcycle0_.BIGINT) ELSE null END) as formula93_0_ FROM ShortCycleWorkOrderCompletions shortcycle0_ WHERE shortcycle0_.Id=?] ---> System.Data.SQLite.SQLiteException: SQL logic error or missing database
near ".": syntax error
    at System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn, String strSql, SQLiteStatement previous, UInt32 timeoutMS, String& strRemain)
   at System.Data.SQLite.SQLiteCommand.BuildNextCommand()
   at System.Data.SQLite.SQLiteDataReader.NextResult()
   at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
   at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
   at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
   at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session)
   at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
   at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
   at NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)
--- End of inner exception stack trace ---
    at NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)
   at NHibernate.Loader.Entity.AbstractEntityLoader.Load(ISessionImplementor session, Object id, Object optionalObject, Object optionalId)
   at NHibernate.Loader.Entity.AbstractEntityLoader.Load(Object id, Object optionalObject, ISessionImplementor session)
   at NHibernate.Event.Default.DefaultLoadEventListener.LoadFromDatasource(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
   at NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
   at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
   at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
   at NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
   at NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
   at NHibernate.Impl.SessionImpl.Get[T](Object id)
   at MMSINC.Data.NHibernate.SessionWrapper.Get[T](Object id) in C:\Solutions\mmsinc\MMSINC.Core\Data\NHibernate\SessionWrapper.cs:line 511
   at MMSINC.Data.NHibernate.RepositoryBase`1.Find(Int32 id) in C:\Solutions\mmsinc\MMSINC.Core\Data\NHibernate\RepositoryBase.cs:line 104
   at MMSINC.Utilities.ActionHelper`4.DoEditWithArgs[TModel](Int32 id, ActionHelperDoEditArgs args, Action`1 onModelFound) in C:\Solutions\mmsinc\MMSINC.Core.Mvc\Utilities\ActionHelper.cs:line 560
   at MapCallMVC.Areas.ShortCycle.Controllers.ShortCycleWorkOrderCompletionController.Edit(Int32 id) in C:\Solutions\mapcall_mvc\MapCallMVC\Areas\ShortCycle\Controllers\ShortCycleWorkOrderCompletionController.cs:line 107
   at MapCallMVC.Tests.Controllers.ShortCycleWorkOrderCompletionControllerTest.TestEdit404sIfShortCycleWorkOrderCompletionNotFound() in C:\Solutions\mapcall_mvc\MapCallMVC.Tests\Areas\ShortCycle\Controllers\ShortCycleWorkOrderCompletionControllerTest.cs:line 165

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Почти такой же ответ:

CASE 
  WHEN
    (NOT TRIM(Installation) GLOB '*[^0-9]*') AND TRIM(Installation) like '_%'
  THEN CAST(TRIM(Installation) AS BIGINT)
END AS intInstallation

Объяснение:

  • [^0-9] = каждый символ, который не является числом
  • С NOT вы получаете всю установку, у которой нет персонажа, который не является числом
  • Подстановочный знак '_%': _ любой символ один раз и % 0 или более любого символа.

После вашего редактирования я смотрю на запрос:

THEN CAST(TRIM(shortcycle0_.Installation) AS shortcycle0_.BIGINT)

Заменить его на:

THEN CAST(TRIM(shortcycle0_.Installation) AS BIGINT)
0 голосов
/ 16 января 2019

Используйте приведенное ниже условие, которое проверяет наличие нецифровых символов и длину усеченного значения Installation:

CASE 
  WHEN
    (NOT TRIM(Installation) GLOB '*[^0-9]*') AND (LENGTH(TRIM(Installation)) > 0)
  THEN CAST(TRIM(Installation) AS BIGINT)
END

Обратите внимание, что тип данных BIGINT в SQLite на самом деле INTEGER (целое число со знаком 1-8 байт).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...