我在SQLite数据库中有一个表Employee
。其主键是GUID类型的“ID”。我尝试使用以下查询找到id
= guid 'a8828ddf-ef22-4d36-935a-1c66ae86ebb3'
的记录但没有运气:
SELECT * FROM Employee
WHERE Employee.Id = 'a8828ddf-ef22-4d36-935a-1c66ae86ebb3'
任何人都可以告诉我该如何编写查询?
谢谢,
答案 0 :(得分:11)
这是一个老问题,但是如果选择的答案是正确的,那么搜索会产生搜索,但它可能并不适合所有人。例如,当使用.NET绑定到SQLite时。
原因是当GUID格式为a8828ddf-ef22-4d36-935a-1c66ae86ebb3
时,您不能只删除短划线并将其放到X'...'
。 GUID有几个部分,数据库以不同的方式存储二进制文件。
当GUID为a8828ddf-ef22-4d36-935a-1c66ae86ebb3
时,它将以X'df8d82a822ef364d5a93b3eb86ae661c'
的小端存储。请注意,所有部分都在字符串中反转。
当然,如果通过将短划线删除为X'a8828ddfef224d36935a1c66ae86ebb3'
来直接插入数据,您也可以使用它来检索它,但如果让.NET处理转换,GUID将存储为小端字节表示。
(这都假设小端架构,没有在大端测试)
答案 1 :(得分:8)
GUID可能存储为二进制blob;尝试:
SELECT * FROM Employee
WHERE Employee.Id = X'a8828ddfef224d36935a1c66ae86ebb3';
答案 2 :(得分:1)
萨米人的回答为我指明了正确的方向。 .NET以不同的方式输出Guid,因此,如果使用.NET进行存储,而不是使用rawsql来获取数据,则rawsql中的guid需要以相同的方式进行转换。 但是,就我而言,这不是小端符号。 使用以下代码,您可以找到正确的字符串:
var byteArray = new Guid("a8828ddf-ef22-4d36-935a-1c66ae86ebb3").ToByteArray();
string hex = BitConverter.ToString(byteArray).Replace("-", string.Empty);
在我的计算机上,这返回:“ DF8D82A822EF364D935A1C66AE86EBB3” 因此,我的原始sql必须是
"select * from [tablename] where ID = X'DF8D82A822EF364D935A1C66AE86EBB3'"
为什么我需要这个;因为我使用的是内存中的SQLite数据库,该数据库是使用EF Core填充的,因此我想在其中测试rawSql命令。 这对于处于相同情况的其他人可能很方便。但是,请记住,在SQLite中工作的rawSql可能无法在另一个数据库上工作(反之亦然)。