--FOR MSSQL
SELECT
CASE
WHEN CHARINDEX('/' ,[ANY_SUPPORT_CHARACTOR_FIELD]) > 1 THEN
SUBSTRING( [ANY_SUPPORT_CHARACTOR_FIELD],1
,CHARINDEX('/' ,[ANY_SUPPORT_CHARACTOR_FIELD])-1)
ELSE NULL
END AS STRING_BEFORE_SLASH
FROM [ANY_TABLE_NAME]
WHERE ......
--FOR MSSQL
SELECT *
FROM
(
SELECT
CASE
WHEN CHARINDEX('/' ,[ANY_SUPPORT_CHARACTOR_FIELD]) > 1 THEN
SUBSTRING( [ANY_SUPPORT_CHARACTOR_FIELD],1
,CHARINDEX('/' ,[ANY_SUPPORT_CHARACTOR_FIELD])-1)
ELSE NULL
END AS STRING_BEFORE_SLASH
FROM [ANY_TABLE_NAME]
) AS PRIMARY_QUERY
GROUP BY STRING_BEFORE_SLASH
ทำให้ดูก็ได้คะ ถ้าไม่ลำบากจนเกินไป ไม่เคยใช้ charindex เลยคะ คือตอนแรก เขียนsql แบบนี้คะ
select substring(number,1,8) as number,date,sum(amount) as amount from chqout where number between '111' and '222' and chqnumber like '[0-9]%' group by substring(chqnumber,1,8),paymentdate
union
select number,date,amount from chqout where number between '111' and '222' and number like '[ก-ฮ]%' order by number
ทีนี้ฟิวด์ number อ่ะคะ มันมีจำนวนไม่เท่ากัน ก็เลยตัดไม่ถูก เลยจะเอาโค้ดที่คุณเขียนให้ดู ไปปรับใช้แทนที่ในส่วนของ substring(number,1,8) as number ทีนี้มันไม่ได้อ่ะคะ เลยไม่รู้จะแก้ยังไงดี
Date :
2010-06-15 14:22:28
By :
จุ๊บุ
No. 9
Guest
อืม ก๊อปปมาผิดพลาดนิดนึงนะคะ ตรง chqnumber กับ number มันคือตัวเดียวกันคะ
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
CREATE FUNCTION [dbo].[GETSTR_BEFORE_SOMTHNIG]
(
@VarStrTofind AS NVARCHAR(MAX) ,@VarSource AS NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
-- Declare the return variable here
DECLARE
@CUTTING_POSITION AS INT ,
@RET_STR AS NVARCHAR(MAX);
-- Add the T-SQL statements to compute the return value here
SET @CUTTING_POSITION = CHARINDEX(@VarStrTofind ,@VarSource);
IF @CUTTING_POSITION <= 1
BEGIN
SET @RET_STR = SUBSTRING(@VarSource ,1 ,@CUTTING_POSITION -1);
END
ELSE
BEGIN
SET @RET_STR ='' ;
END
-- Return the result of the function
RETURN @RET_STR ;
END
GO
เอาไปรันที่ Sql Server Management Studio
ซึ่งจะได้ scalar function ตัวใหม่ จากนั้นเอาไปใส่ใน query เดิมของคุณ
น่าจะง่ายกว่าค่ะ
Code (C#)
select GETSTR_BEFORE_SOMTHNIG('/' , number) as number
,date, sum(amount) as amount
from chqout
where (number between '111' and '222')
and (number like '[0-9]%')
group by GETSTR_BEFORE_SOMTHNIG('/', number)
,paymentdate