简短版: 有没有办法根据该值中最后一个大写字母的索引(位置)轻松提取和ORDER BY数据库的子字符串,只使用SQL?
长版本:我有一个带有用户名字段的表,用户名的约定是第一个名称的大写第一个首字母,后跟姓氏的大写第一个首字母,后跟姓氏的其余部分.因此,用户名字段排序是"错误的".通过用户名值的子字符串排序理论上可以工作,例如
SUBSTRING(username,2, LEN(username))
...除了在其他两个首字母之间有大写中间首字母的值.我很想知道,仅使用SQL(MS SQL Server),是否有一种相当简单/简单的方法:
假设这甚至可以远程实现,我认为必须循环遍历每个用户名的各个字母来完成它,使其效率极低,但如果你有一个神奇的快捷方式,请随意分享.注意:这个问题纯粹是学术性的,因为我决定采用更简单的方法.如果这是可能的,我只是好奇.
我有一个表变量@searchResult
:
DECLARE @searchResult TABLE (
[name_template] NVARCHAR(50),
[record_id] INT,
[record_name] NVARCHAR(50)
);
Run Code Online (Sandbox Code Playgroud)
和表[records]
:
CREATE TABLE [records] (
[record_id] INT IDENTITY(1, 1) PRIMARY KEY,
[record_name] NVARCHAR(50)
)
Run Code Online (Sandbox Code Playgroud)
@searchResult
只包含[name_template]
填充的记录。我想与最新的更新它[record_id]
,并[record_name]
从[records]
表匹配[name_template]
。
我试过以下 SQL 查询但没有成功:
UPDATE @searchResult
SET [record_id] = r.[record_id], [record_name] = r.[record_name]
FROM (
SELECT TOP 1
r.[record_id]
, r.[record_name]
FROM [records] AS r
WHERE r.[record_name] LIKE [name_template]
ORDER BY r.[record_id] DESC
) AS r;
Run Code Online (Sandbox Code Playgroud)
错误信息:
无效的列名“name_template”。
@searchResult …
我已将 userControl 从 vb6 迁移到 vb.net,但我对其透明度有疑问。在vb6中,属性backstyle用于使控件透明,但在vb.net中,我找不到它。这个属性有同等的吗?
我有这个相当复杂的查询:
SELECT distinct
v.KodQ, v.DodPeriodika,
v.GodGP, v.Periodika as Period,
k.Oblast, k.KratokNazivSI,
k.NazivSI, k.Periodika,
v.rKod, r.Naziv,
v.rDatum,
v.IT, v.Primerok, v.BrojIE,
CONVERT(varchar, CONVERT(DATETIME, v.RefPeriodOd), 103) as RefPeriodOd,
CONVERT(varchar, CONVERT(DATETIME, v.RefPeriodDo), 103) as RefPeriodDo
FROM GP.dbo.MyTable1 AS v
INNER JOIN GP.dbo.MyTable2 as k
ON k.KodSI = v.KodQ AND k.DodObr = v.DodPeriodika
INNER JOIN GP.dbo.MyTable3 AS r
ON r.rKod = v.rKod
WHERE v.GodGP = GodGP and CHARINDEX('-', RefPeriodDo, 0) != 0
Run Code Online (Sandbox Code Playgroud)
我需要转换v.RefPeriodOd和v.RefPeriodDo从这种格式'31 -癸2017'年以这种格式'31/12/2017'年.
是的我知道将DateTime保存为字符串(varchar)是个坏主意,但是应用程序现在正在使用中,所以我现在无法真正做QA并重构我的表.
我正在使用这个声明:
CONVERT(varchar, …
Run Code Online (Sandbox Code Playgroud) 我拼命想在这里找到这个问题,但找不到与这个问题相关的任何内容.
在SQL(SMSS)中,我想要一个ID列.应根据同一表中的3列生成ID的值.
ID | column1 | column2 | column3
1 | 2016 | 101 | 1
2 | 2017 | 101 | 1
2 | 2017 | 101 | 1
3 | 2017 | 303 | 1
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我生成这个ID吗?
我的数据看起来像:
客户表
CustomerId CustomerName CustomerEmail
------------------------------------------
1 Ben Ben@gmail.com
2 Robert Robert@gmail.com
3 Paul Paul@gmail.com
Run Code Online (Sandbox Code Playgroud)
客户联系人表
CustomerContactId CustomerId ContactName ContactEmail
----------------------------------------------------------
99 1 Lisa Lisa@msn.com
98 3 Jane Jane@msn.com
97 3 Wendy Wendy@msn.com
Run Code Online (Sandbox Code Playgroud)
这是我正在寻找的结果:
[
{
"CustomerId": 1,
"Names": [ "Ben","Lisa" ],
"Emails": [ "Ben@gmail.com","Lisa@msn.com" ]
},
{
"CustomerId": 2,
"Names": [ "Robert" ],
"Emails": [ "Robert@gmail.com" ]
},
{
"CustomerId": 3,
"Names": [ "Paul","Jane","Wendy" ],
"Emails": [ "Paul@gmail.com","Jane@msn.com","Wendy@msn.com" ]
}
]
Run Code Online (Sandbox Code Playgroud)
我尝试过的: 我很尴尬地说我还没有接近:
CustomerId CustomerName CustomerEmail
------------------------------------------ …
Run Code Online (Sandbox Code Playgroud) 我有一个下面的查询,其中有一个日期过滤器EST_PICK_DATE between '2015-02-01' and '2015-06-01'
,其中逻辑EST_PICK_DATE
应该是从当月和下个月的第一个日期起3个月.当前月份的IE EST_PICK_DATE
应该在'2015-02-01'
和之间'2015-06-01'
.
我需要动态地写下面的查询.
在下面的查询我已硬编码值'2015-02-01'
和'2015-06-01'
,但它应该动态地取得.
怎么做到这一点?我在SSIS包中使用此查询,那么我应该在SQL级别执行还是应该在包中实现此逻辑?如果是,怎么样?
INSERT INTO STG_Open_Orders (Div_Code, net_price, gross_price)
SELECT ord.DIV_CODE AS Div_Code, ord_l.NET_PRICE AS net_price, ord_l.gross_price AS gross_price,
FROM ORD ord inner join ORD_L ord_l ONord.ORD_ID=ord_l.ORD_ID
WHERE ord_l.EST_PICK_DATE BETWEEN '2015-02-01' AND'2015-06-01'
Run Code Online (Sandbox Code Playgroud) 我想在我的标签示例中使用此输出:2016年4月20日,但我得到4/20/2016:1200:00:AM
我试图修改它,但无法解决这个错误
没有方法的重载需要1个参数导致此代码
lblDate.Text = rdr.GetValue(4).ToString("MMMM d,yyyy");
Run Code Online (Sandbox Code Playgroud)
这是整个代码.
private void GetData()
{
SqlConnection con = new SqlConnection("Data Source = localhost\\SQLEXPRESS;Initial Catalog = MejOnlineManagementDB00;Integrated Security=True;");
con.Open();
SqlCommand cmd = new SqlCommand(@"SELECT orderProdName,orderProdType,orderQuantity,orderStatus,orderDateOrdered
FROM orders2
WHERE orderCustomer='"+DropDownList1.SelectedItem.Value.ToString()+"'",con);
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.HasRows)
{
while (rdr.Read())
{
lblProdName.Text = rdr.GetValue(0).ToString();
lblProdType.Text = rdr.GetValue(1).ToString();
lblQuantity.Text = rdr.GetValue(2).ToString();
lblStatus.Text = rdr.GetValue(3).ToString();
lblDate.Text = rdr.GetValue(4).ToString("MMMM d,yyyy");
}
}
con.Close();
}
Run Code Online (Sandbox Code Playgroud) 所以我想知道为什么:
SELECT Colunm_Name Column_Name from Table_Name
Run Code Online (Sandbox Code Playgroud)
列名之间没有逗号不会返回语法错误,而是返回仅包含第一列的记录.起初我以为逗号是可选的,但后来我尝试了:
SELECT Colunm_Name Column_Name Column_Name from Table_Name
Run Code Online (Sandbox Code Playgroud)
这会在第三列附近返回语法错误.知道为什么吗?是否有理由为什么你可以放两个列名而不用逗号,即使它省略了第二列?日Thnx!
我正在使用第三方Web服务,其中所有方法都具有以下签名:
SomeResponseClass SomeMethod(SomeRequestClass request)
Run Code Online (Sandbox Code Playgroud)
每个方法都有自己的请求类和它自己的响应类.然而,所有请求都有一些共同点,并且所有响应都有共同点.
每个请求类都有一些用于标识的属性:username
并且token
,每个响应类都有一些属性来指示是否存在错误:status
和error
.
我正在寻找一种优雅的方法来创建一个实例化我的请求的方法 - 这样我就不必在调用服务的每个方法中重复自己.由于我无法更改类,并且没有所有类的通用接口或基类,我找到的唯一解决方案是使用dynamic
:
private T CreateRequest<T>() where T : new()
{
if(string.IsNullOrEmpty(_Token))
{
Login();
}
// this has to be dynamic for the next 2 rows to pass compilation.
dynamic request = new T();
request.username = _UserName;
request.token = _Token;
return (T)request;
}
Run Code Online (Sandbox Code Playgroud)
类似于从服务响应填充我自己的实体:
// response have to be dynamic for getting the error and status properties
private static T CreateServiceResponse<T>(dynamic response) where T …
Run Code Online (Sandbox Code Playgroud)