我有以下适用于SQL的代码:
"(CASE WHEN isnumeric(Installation) > 0 THEN cast(Installation as bigint) ELSE null END) "
我正在尝试将其转换为可在SQLite中使用,但是遇到麻烦,因为我对SQLite的经验很少。基本上,我想将我的stringcolumn(安装)转换/转换为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");
不需要全部三个就可以工作,而这只是我尝试过的。
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
答案 0 :(得分:0)
使用以下条件,该条件检查非数字字符的存在和Installation
的修整值的长度:
CASE
WHEN
(NOT TRIM(Installation) GLOB '*[^0-9]*') AND (LENGTH(TRIM(Installation)) > 0)
THEN CAST(TRIM(Installation) AS BIGINT)
END
请注意,SQLite中的数据类型BIGINT
实际上是INTEGER
(1-8字节有符号整数)。
答案 1 :(得分:0)
几乎相同的答案:
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)